用C语言向read()送入带有多个换行符的输入--第一个字符 "消耗 "了?

问题描述 投票:0回答:1

我试图从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,每个数字上都有换行符,它就会给我所有带数字和换行符的字符串,和我输入的一模一样。

我做错了什么?

c io buffer system-calls
1个回答
1
投票

这个问题已经由上面的Mat和kaylum回答过了。

当在while循环中使用read()时,每次调用一次将输入的字节读取到缓冲区中(对于多个字节),你必须增加 char* buf 指针,由你到目前为止读了多少。

read(0, buff + buf_count, (buf_capacity - buf_count)) 是固定的代码行。

© www.soinside.com 2019 - 2024. All rights reserved.