如何从stdin读取一行,阻塞直到找到换行符?

时间:2012-09-03 17:40:21

标签: c io

我试图从命令行的stdin一次读取任意长度的一行。我不确定我是否能够包含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,这使得它不适合接受用户输入。

我该怎么做?我知道这应该是微不足道的,但我还没能弄清楚。

2 个答案:

答案 0 :(得分:54)

试试这个补丁

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

答案 1 :(得分:5)

我能够在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或文件指针可能会导致相同的行为。这可能是问题吗?