C popen()之后的printf():奇怪的行为
我不理解在popen()之后使用printf()的行为。我有一个包含以下3个文件的文件夹: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,
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,用于在问题中发布解决方案。请将您的解决方案作为您自己问题的答案发布。这才是真正的工作原理。如果你以后再这样做,我一定会投赞成票。我正在关注这个帖子。