我试图从STDIN中读取输入,使用系统调用read()函数。 我使用的是一个动态分配的缓冲区。
我已经从这个函数中剥离了很多细节--所有的错误检查,所有的重新分配等等。 这些都不会影响问题中的错误。 下面是代码。
int main(void) {
char *buff;
long buf_count = 0;
long buf_capacity = 8192;
buff = (char *)malloc(buf_capacity);
long read_count;
while ((read_count = read(0, buff, (buf_capacity - buf_count))) != 0) {
buf_count += read_count;
}
for (int i = 0; i < buf_count; i++)
putchar(buff[i]);
}
这段代码是 long read_count;
到 while 循环的末尾是有问题的。 当我从STDIN读入时,我可以毫无问题地输入长字符串,但如果我输入一个有几个换行符的字符串,就会得到错误的输出。 但是如果我输入一个有几个换行符的字符串,我就会得到错误的输出。 例如,如果我输入字符串
1
2
3
和所有的换行符,那么我将只收到这样的输出。
3
如果我把字符串
12345
和额外的换行(有两个),那么我将得到这样的东西。
2345
当然,这两种行为都不是我想要的。 我知道问题出在我对read()的使用上,因为如果我把调用read()的代码替换成类似这样的代码。
int ch;
int i = 0;
while ((ch = getchar()) != EOF)
{
buff[i++] = ch;
}
buf_count = i;
...那么输出就会和预期的一样。 如果我输入1 2 3,每个数字上都有换行符,它就会给我所有带数字和换行符的字符串,和我输入的一模一样。
我做错了什么?
这个问题已经由上面的Mat和kaylum回答过了。
当在while循环中使用read()时,每次调用一次将输入的字节读取到缓冲区中(对于多个字节),你必须增加 char* buf
指针,由你到目前为止读了多少。
read(0, buff + buf_count, (buf_capacity - buf_count))
是固定的代码行。