C getline在换行符之后继续接受输入

时间:2018-12-17 03:35:47

标签: c gcc getline

我实际上是在尝试从用户那里获取一行文本,然后将其反转。

#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似乎并没有停止从键盘上读取输入,并且程序也没有前进。我在-std=c11中使用gcc。出于好奇,我在调用printf的行的两侧分别对getline进行了两次调用,并打印了它们的输出。我不确定我做错了什么或误解了。

1 个答案:

答案 0 :(得分:3)

在您的代码中,您拥有:

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

是什么让您认为可以传递长度为null的指针? 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,也可能已经分配了内存。