如何从标准输入读取一行,阻塞直到找到换行符?
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
【讨论】:
这样就解决了。我意识到我的错误;我误读了文档并认为n
是size_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(&buffer...
块。如果我将NULL
分配给buffer
,它会再次阻塞(如广告所示),并将该行存储在新分配的缓冲区中。
但如果我写
getline(NULL, &n, stdin);
然后getline
失败,似乎没有阻止。无效的n
或文件指针也可能导致相同的行为。会不会是这个问题?
【讨论】:
以上是关于如何从标准输入读取一行,阻塞直到找到换行符?的主要内容,如果未能解决你的问题,请参考以下文章