我有这样的代码:
#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));
}
}
Run Code Online (Sandbox Code Playgroud)
在stdin上添加一些行之后,例如:
示例
示例示例
...
它通常不会显示.相反,在输入块的末端附近总会有一些奇怪的字符.有人可以解释一下吗?
read读二进制数据.它报告它读取的确切字节数.除了读取这些字节之外,它不会执行任何操作.
C字符串不包含其长度的记录.字符串的结尾由零字节表示.
因此,当read报告它读取k字节时,这正是它写入的字节数input.它不会添加零字节,因此您所拥有的input不是字符串:它是一个字节数组,其中只有第一个字符串k需要.
要打印出这些字节,请将数据长度传递给write.由于您要打印出read读取的字节,请传递从中返回的值read.
int k = read(0,input,100);
if(k <= 0) break;
write(1, input, k);
Run Code Online (Sandbox Code Playgroud)
如果要将这些字节用作字符串,则需要附加尾随空字节.请注意,如果输入本身包含空字节,则第一个将是字符串的结尾.
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);
Run Code Online (Sandbox Code Playgroud)
无法保证您阅读的数据将被终止.如果不是,您的write调用将在收到的内容之外写入数据,仅在找到前0字节或崩溃时停止.
你知道这样可以input保存k数据字节
write(1,input,strlen(input));
Run Code Online (Sandbox Code Playgroud)
应该
write(1,input,k);
Run Code Online (Sandbox Code Playgroud)