C popen()之后的printf():奇怪的行为

C popen()之后的printf():奇怪的行为,c,C,我不理解在popen()之后使用printf()的行为。我有一个包含以下3个文件的文件夹: middle.txt test.app 测试c test.c是test.app的源代码: 测试c 为什么不是这个 Output string: test.app 编辑 使用评论中的建议,我修改了3行(position+8是我原始源代码中的一个错误),其中包括: char output[1000] = {0}; char result[9] = {0}; memcpy(result, position,

我不理解在popen()之后使用printf()的行为。我有一个包含以下3个文件的文件夹:

  • middle.txt
  • test.app
  • 测试c
  • test.ctest.app的源代码:

    测试c

    为什么不是这个

    Output string:
    test.app
    
    编辑

    使用评论中的建议,我修改了3行(
    position+8
    是我原始源代码中的一个错误),其中包括:

    char output[1000] = {0};
    char result[9] = {0};
    memcpy(result, position, sizeof(result));
    
    char output[1000] = {0};
    char result[9] = {0};
    memcpy(result, position, sizeof(result) - 1);
    
    但现在这是输出:

    Output string: test.app
    middle.txt
    test.app
    test.c
    
    Output string: test.app
    
    我用以下内容修改了3行(通过打开帖子):

    char output[1000] = {0};
    char result[9] = {0};
    memcpy(result, position, sizeof(result));
    
    char output[1000] = {0};
    char result[9] = {0};
    memcpy(result, position, sizeof(result) - 1);
    
    现在是输出:

    Output string: test.app
    middle.txt
    test.app
    test.c
    
    Output string: test.app
    

    输出中出现的1个字节是这种奇怪行为的原因。我们必须注意复制的大小,打印的缓冲区必须是以null结尾的字符串

    您在未初始化的缓冲区上使用的
    strncat
    ,因此您得到UB。初始化缓冲区,例如使用
    字符输出[1000]={0}或具有
    输出[0]=0@Jabberwocky:你说得对,这是一个非常愚蠢的错误!感谢您如果您在
    位置
    后面有太多数据,则结果不会被NUL终止。并且
    position+8
    将指向“test.app”
    char output[1000]={0}之后的换行符
    字符结果[9]={0}
    memcpy(结果、位置、大小(结果))
    ,这是输出:
    输出字符串:test.app middle.txt test.app test.c
    (在第一个test.app之后有一个换行符)-1,用于在问题中发布解决方案。请将您的解决方案作为您自己问题的答案发布。这才是真正的工作原理。如果你以后再这样做,我一定会投赞成票。我正在关注这个帖子。