C read()添加了奇怪的字符

时间:2013-12-18 22:03:21

标签: c posix

我有这样的代码:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
int main(){
    char input[100];
    while(1){
        int k = read(0,input,100);
        if(k == 0) break;
        write(1,input,strlen(input));
    }
}

在stdin上添加一些内容后,例如:
示例示例
示例示例
...

它通常不会显示。相反,在输入块的末端附近总会有一些奇怪的字符。有人可以解释一下吗?

2 个答案:

答案 0 :(得分:7)

read读取二进制数据。它报告它读取的确切字节数。除了读取这些字节之外,它什么都不做。

C字符串不包含其长度的记录。字符串的结尾由零字节表示。

因此,当read报告它读取k个字节时,这正是它写入input的字节数。它不会添加零字节,因此input中的内容不是字符串:它是一个字节数组,其中只需要第一个k

要打印出这些字节,请将数据长度传递给write。由于您要打印read读取的字节,请传递从read返回的值。

int k = read(0,input,100);
if(k <= 0) break;
write(1, input, k);

如果要将这些字节用作字符串,则需要追加一个尾随空字节。请注意,如果输入本身包含空字节,则第一个将是字符串的结尾。

int k = read(0,input,99);  /*1 less to make room for the null terminator*/
if (k <= 0) break;
input[k] = 0;
fputs(input, stdout);

答案 1 :(得分:6)

无法保证您阅读的数据将被终止。如果不是,则write调用将在收到的内容之外写入数据,仅在找到前0字节或停止时停止。

您知道input保留k个字节的数据,所以

write(1,input,strlen(input));

应该是

write(1,input,k);