36

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

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

4

2 回答 2

67

试试这个补丁

char *line = NULL;
+size_t size;
+if (getline(&line, &size, stdin) == -1) {
-if (getline(&line, 0, stdin) == -1) {
    printf("No line\n");
} else {
于 2012-09-03T17:49:56.353 回答
7

我已经能够在以下位置重现“非阻塞”行为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...块。如果我分配NULLbuffer,它再次阻塞(如广告所示),并将该行存储在新分配的缓冲区中。

但如果我写

getline(NULL, &n, stdin);

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

于 2012-09-03T17:51:17.600 回答