【问题标题】: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,这使得它不适合接受用户输入。

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

【问题讨论】:

标签: c io


【解决方案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 或文件指针也可能导致相同的行为。会不会是这个问题?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    相关资源
    最近更新 更多