gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:49:16 25 4
gpt4 key购买 nike

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

#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 进行了两次不同的调用,并且都打印了它们的输出。我不确定我做错了什么或误解了。

最佳答案

在您的代码中,您有:

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,也可能已经分配了内存。

关于C getline 在换行后继续接受输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53808651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com