繁体   English   中英

在 C 中将多个换行符输入到 read() - 第一个字符“已使用?”

[英]Feeding input with multiple newlines to read() in C - first character “consumed?”

我正在尝试使用系统调用 read() function 从 STDIN 读取输入。 我正在使用动态分配的缓冲区。

我已经从这个 function 中删除了很多细节——所有的错误检查、所有的重新分配等等。这些都不会影响有问题的错误。 这是代码:

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 读入时,我可以毫无问题地输入长字符串。 但是如果我输入一个包含多个换行符的字符串,我会得到错误的 output。 例如,如果我输入字符串

1
2
3

连同它的所有换行符,那么我只会收到 output 这个。

3

如果我输入字符串

12345

有了那个额外的换行符(有两个),我就会得到这样的东西。


2345

...因此标题。 当然,这些行为都不是我想要的。 而且我知道问题出在我对 read() 的使用上,因为如果我将调用 read() 的代码替换为以下内容:

int ch;
int i = 0;
while ((ch = getchar()) != EOF)
{
    buff[i++] = ch;
}
buf_count = i;

...那么 output 将符合预期。 如果我在每个数字上输入 1 2 3 和换行符,它将给我所有带有数字和换行符的字符串,就像我输入的一样。

我做错了什么?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM