gpt4 book ai didi

c - read() 缓冲区中出现乱码?

转载 作者:太空宇宙 更新时间:2023-11-04 06:41:31 44 4
gpt4 key购买 nike

我是 C 的新手,所以我对以下行为感到非常困惑。使用 pipe()fork() 我正在读取以下简单的 ruby​​ 程序的输出:

puts "success"

通过调用 C 中的读取函数:

n = read(fd[0], readbuffer, sizeof(readbuffer));
printf("received: %s", readbuffer);

但是,printf 将一堆“无法识别的字符”符号(如菱形中的问号)打印到控制台。此外,进行如下比较:

    if (strcmp(readbuffer, "success") == 0)
{
/* do something */
}

失败。我做错了什么?

编辑:按要求声明。我对 memsetting 一无所知,这是我在 C 中的第一天。

int fd[2], in;
pid_t pid;
char readbuffer[6];

编辑:

'mu is too short'的回答也解决了这个问题。共识似乎是使用 memset 是矫枉过正。我是一个新手 C 程序员,所以我不得不相信评论者的意见。然而,这是 argumentum ad populum 和 mu 太短可能确实更合适。无论如何,我建议阅读这两个答案,因为任何“矫枉过正”可能仍然微不足道。

最佳答案

正如其他人所指出的,您的缓冲区不够大,无法容纳您正在阅读的文本,并且您无法确保它以 null 结尾。

但是在每次读取之前使用memset() 将整个缓冲区归零是不必要的;您只需要确保在您读取的数据末尾有一个空值(当然还要让您的缓冲区更大)。

如果你使 readbuffer 至少有 9 个字符长,并替换:

n = read(fd[0], readbuffer, sizeof(readbuffer));

..与..

n = read(fd[0], readbuffer, sizeof(readbuffer) - 1);
readbuffer[n] = '\0';

..那么应该这样做(尽管理想情况下您应该检查 n 是否 >= 0 以确保 read() 成功)。指定比读取缓冲区大小小 1 可确保 readbuffer[n] 不会溢出(但如果 read() 失败,它可能会溢出)。

然后你只需要处理最后的换行。

这还假设整个字符串在一次读取调用中被读取。在这种情况下很可能,但通常在使用 read 时有必要连接多个读取,直到您读取了足够的数据。

关于c - read() 缓冲区中出现乱码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7510380/

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