如何从标准输入读取一行,阻塞直到找到换行符?

Posted

技术标签:

【中文标题】如何从标准输入读取一行,阻塞直到找到换行符?【英文标题】:How to read a line from stdin, blocking until the newline is found? 【发布时间】:2012-08-28 10:35:33 【问题描述】:

我正在尝试从命令行的标准输入一次读取任意长度的一行。我不确定我是否能够包含 GNU readline 并且更愿意使用库函数。

我读过的文档表明getline 应该可以工作,但在我的实验中它不会阻塞。我的示例程序:

#include <stdio.h>
int main()

    char *line = NULL;
    if (getline(&line, NULL, stdin) == -1) 
        printf("No line\n");
     else 
        printf("%s\n", line);
    
    return 0;

产生No line,这使得它不适合接受用户输入。

我该怎么做?我知道这应该是微不足道的,但我一直无法弄清楚。

【问题讨论】:

getline() 确实 阻止(刚刚在stdin 上测试过)。你能发布示例代码吗? How to read a line from the console in C的可能重复 【参考方案1】:

试试这个补丁

char *line = NULL;
+size_t size;
+if (getline(&line, &size, stdin) == -1) 
-if (getline(&line, 0, stdin) == -1) 
    printf("No line\n");
 else 

【讨论】:

这样就解决了。我意识到我的错误;我误读了文档并认为nsize_t 而不是size_t *。谢谢! 我真的很喜欢这个答案中代码的版本控制风格。 有没有解释为什么这样做?我假设因为文档说当该行是空指针时忽略大小,所以我也可以将空指针传递给大小。 @NickMiller:如果 line 参数指向 NULL,则忽略 size 参数的 输入值。然后将 size 参数设置为函数为您分配的缓冲区的大小,这就是它不能为 NULL 的原因。 什么时候getline在STDIN中返回-1【参考方案2】:

我已经能够在getline 上重现“非阻塞”行为:

#include <stdio.h>
#include <stdlib.h>

int main()

        char    *buffer;
        size_t  n = 1024;
        buffer = malloc(n);
        return getline(&buffer, &n, stdin);

getline(&amp;buffer... 块。如果我将NULL 分配给buffer,它会再次阻塞(如广告所示),并将该行存储在新分配的缓冲区中。

但如果我写

getline(NULL, &n, stdin);

然后getline 失败,似乎没有阻止。无效的n 或文件指针也可能导致相同的行为。会不会是这个问题?

【讨论】:

以上是关于如何从标准输入读取一行,阻塞直到找到换行符?的主要内容,如果未能解决你的问题,请参考以下文章

C/C++ 服务器,通过标准输入/标准输出与客户端通信(阻塞标准输入,直到读取了多个字节)

如何从标准输入读入数据--java语言

练习3.3

从标准输入读取所有文本到字符串

go:读取标准输入

go:读取标准输入