【问题标题】:C getline continuing to take input after newlineC getline 在换行符后继续接受输入
【发布时间】:2018-12-17 03:35:47
【问题描述】:

我试图从用户那里获取一行文本,然后将其反转。

#define LENGTH 0xFF

char *buffer = malloc(LENGTH), *output = malloc(LENGTH);
unsigned char length_read, count = 0;
length_read = getline(&buffer, 0, stdin);

while (length_read >= 0)
  output[count++] = buffer[length_read--];

理论上output的值应该是buffer的倒数。但是当我运行我的程序时,getline 似乎并没有停止从键盘读取输入并且程序没有前进。我将 gcc 与-std=c11 一起使用。出于好奇,我在调用getline 的行的两侧分别对printf 进行了两个不同的调用,并打印了它们的输出。我不确定我做错了什么或误解了。

【问题讨论】:

  • 你能检查getline的返回值并从函数中获取length_read而不是保持返回值
  • @ThiruShetty 我在getline 调用之后添加了printf("%s %d\n", buffer, length_read),它在提示我输入之前打印了“255”。
  • 是什么让你认为你可以为长度传递一个空指针? getline() 的 POSIX 规范当然不允许这样做——它要求函数可以写入 *n。我在getline(3) 的 Linux 手册页中也没有看到任何缓解。我认为您正在使用未定义的行为;我很惊讶你不只是崩溃。
  • @JonathanLeffler 修复了它,我将 const 变量设置为 LENGTH 并传递了对它的引用,现在一切正常。如果你把它变成一个答案,我会接受它。
  • 如果您的两个printf() 语句都打印,那么getline() 本身并没有被卡住。使用unsigned char 作为来自getline() 的返回值是有风险的——它返回一个ssize_t,它通常至少有4 个字节,通常是8 个字节长。你可能会误解它返回的内容,尤其是遇到 EOF 并返回 -1(这是它的返回值,而不是 EOF,尽管两者通常相同)。

标签: c gcc getline


【解决方案1】:

在您的代码中,您有:

char *buffer = malloc(LENGTH);
unsigned char length_read;
length_read = getline(&buffer, 0, stdin);

是什么让你认为你可以为长度传递一个空指针? getline() 的 POSIX 规范当然不允许这样做——它要求函数可以写入 *n。我在getline(3) 的 Linux 手册页中也没有看到任何缓解。我认为您正在使用未定义的行为;我很惊讶你不只是崩溃。

此外,如果您的两个printf() 语句都打印,那么getline() 本身不会被卡住。

使用unsigned char 作为来自getline() 的返回值是在冒险——它返回一个ssize_t,它通常至少有4 个字节,通常是8 个字节长。你可能会误解它返回的内容,尤其是遇到 EOF 并返回 -1(而 -1 是它遇到 EOF 时的返回值,而不是 EOF,尽管两者通常相同)。

更典型的用法是:

char *buffer = 0;
size_t buflen = 0;

ssize_t length_read = getline(&buffer, &buflen, stdin);

即使输入失败也不要忘记释放buffer;即使立即获得 EOF,也可能已分配内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 2016-01-24
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    相关资源
    最近更新 更多