gpt4 book ai didi

c - 为什么这段代码最后打印垃圾?为什么 strlen 返回不正确的值?

转载 作者:行者123 更新时间:2023-11-30 20:41:59 25 4
gpt4 key购买 nike

我正在运行以下程序

int main(int argc, char const *argv[])
{
char fileName[NAMESIZE];
char buffer[BUFFSIZE];
buffer[0] = 0;
int bytes;

bytes = read(0 ,fileName, NAMESIZE);
char command[COMMANDSIZE];
char outAux[TAGSIZE];
fileName[bytes - 1] = 0;

sprintf(command, "minisat %s | grep \"Number of v\" -A2 | sed 's/|//g'| sed 's/: */: /g' | sed 's/^ *//g'", fileName);

FILE * fp;
fp = popen(command, "r");

while(fgets(outAux, TAGSIZE, fp)){
strcat(buffer, outAux);
}

pclose(fp);
write(1, buffer, BUFFSIZE);

return 0;
}

据我了解,fgets 确实在末尾添加了 0。但是,输出如下:

Number of variables: 3                                         
Number of clauses: 2
Parse time: 0.00 s
(trash)

它正确地打印了我想要的内容,但随后它开始打印垃圾,就好像末尾没有 0

我尝试通过执行以下操作强制为 0 来解决此问题:在 while 循环的每次迭代中保存 outAux 的长度,将其添加到计数器 buffLen,然后执行 buffer[buffLen] = 0

但是,这会失败,因为 strlen 没有返回 outAux 的长度。例如,“变量数量:3\n”这一行根据 strlen 的长度为 64

如何解决我的问题? (如果可能的话,我还想知道为什么 strlen 返回不正确的值)

编辑:最初的问题来 self 错误地使用 write。然而,我仍然有我原来的问题。如果我运行以下代码:

fgets(outAux, TAGSIZE, fp));
printf("%s", outAux);
printf("%d", strlen(outAux));

我得到以下输出:

Number of variables: 3
64

为什么 strlen 返回这么大的值?

最佳答案

我不知道 minisat 是什么或做什么,但我敢打赌 TAGSIZE 等于 64 并且 minisat 只是不会输出 fgets 识别为换行符的任何内容。因此,fgets 只是捕获管道输出,而您看到的“垃圾”只是开始时缓冲区中的剩余内容。

由于缓冲区溢出,您的代码很容易出现各种未定义的行为。

关于c - 为什么这段代码最后打印垃圾?为什么 strlen 返回不正确的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57895866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com