1

我编写了以下代码,但我不明白为什么 read 没有按照我期望的方式存储字符:

char temp;
char buf[256];

    while(something)   
        read (in,&temp, 1);
        buf[strlen(buf)] = temp;
     }

如果我在阅读时打印tempbuf数组的最后一个位置,有时它们不匹配。例如,字符可能是 'd' 但数组包含%,或者字符是0并且数组包含.

我正在阅读少于 256 个字符,但这没关系,因为我在阅读时正在打印。

我错过了一些明显的东西吗?

4

2 回答 2

2

是的,你没有初始化buf——strlen(buf)未定义。你应该像这样初始化它:

buf[0] = 0;

此外,最好跟踪长度而不是调用strlen每次迭代来避免Shlemiel thepainter algorithm

您还应该检查调用中的错误read(2)-- 如果它返回 -1 或 0,您应该跳出循环,因为这意味着发生错误或者您到达了文件/输入流的末尾。

于 2012-07-12T20:16:29.243 回答
1

不要strlen在此代码中使用。strlen依赖于它的参数是一个NULL终止的 C 字符串。因此,除非您将整个缓冲区初始化为0,否则此代码将不起作用。

无论如何,在缓冲数据时使用strlen 它不是一个好的选择,即使您知道您正在使用可打印的字符串数据,如果只是因为每次strlen都会遍历字符串以获得您的长度。

保留一个名为 eg 的单独计数器,numRead仅附加到bufnumRead位置,并按numRead您读取的数量递增。

于 2012-07-12T20:45:53.140 回答