【发布时间】: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,尽管两者通常相同)。