我编写了以下代码,我不明白为什么读取不按照我期望的方式存储字符:
char temp;
char buf[256];
while(something)
read (in,&temp, 1);
buf[strlen(buf)] = temp;
}
如果我在阅读时打印temp
和buf
数组的最后一个位置,有时它们不匹配。例如,字符可能是“d”,但数组包含%
或字符为0
,数组包含.
我阅读的字符少于256个,但这并不重要,因为我在阅读时正在打印。
我错过了一些明显的东西吗?
答案 0 :(得分:2)
是的,您尚未初始化buf
- strlen(buf)
未定义。你应该这样初始化它:
buf[0] = 0;
此外,最好跟踪长度,而不是每次迭代调用strlen
以避免Shlemiel the painter algorithm。
你也应该检查read(2)
调用中的错误 - 如果它返回-1或0,你应该突破你的循环,因为这意味着发生错误或你到达结束时文件/输入流。
答案 1 :(得分:1)
请勿在此代码中使用strlen
。 strlen
依赖于它的参数是NULL
终止的C字符串。因此,除非您将整个缓冲区初始化为0
,否则此代码不起作用。
无论如何strlen
不是在缓冲数据时使用的好选择,即使您知道自己正在使用可打印的字符串数据,只是因为{{1每次遍历字符串只是为了得到你的长度。
保留一个单独的柜台,例如strlen
,仅在numRead
位置附加到buf
,并按您所阅读的金额递增numRead
。