我有这样的代码:
#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上添加一些内容后,例如:
示例示例
示例示例
...
它通常不会显示。相反,在输入块的末端附近总会有一些奇怪的字符。有人可以解释一下吗?
答案 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);