我正在使用Mojave在MacBook上用C语言编写一个程序,并且试图使用fgets()从stdin中获取字符串。
我的代码可以编译-唯一的问题是,当我在终端中运行程序时,在调用fgets()并键入所需的输入后,我不知道如何用信号通知输入结束该程序可以继续运行。
我认识到很多人都遇到过这个问题,并且该网站上有很多页面解决了这个问题。但是,所有解决方案(据我了解)都没有为我工作。我已经读过this和this,但这些都无济于事。
我已经查看了fgets()的文档,其中说:
“ fgets()最多从流中读取小于大小的字符,并将其存储到s指向的缓冲区中。在* EOF *或换行符之后停止读取。如果读取了换行符,则将其存储到一个终止的空字节(\ 0)存储在缓冲区中的最后一个字符之后。” -来自this page。
在终端中输入'stty all'表明EOF确实对应于^ D。我已经尝试过两次输入^ D,三次,按Enter再按^ D,^ D再按Enter,依此类推。等等。
我在做什么错?以下是代码的相关部分(最初来自here,位于“指向包含指针的结构的指针”部分下):
#include <stdio.h>
typedef struct
{
char name[21];
char city[21];
char phone[21];
char *comment;
} Address;
int main(void)
{
Address s;
char comm[100];
fgets(s.name, 20, stdin);
fgets(s.city, 20, stdin);
fgets(s.phone, 20, stdin);
fgets(comm, 100, stdin);
return 0;
}
答案 0 :(得分:2)
您不测试fgets()
的返回值:如果确实从终端发出信号表明文件结束,则对fgets()
的后续调用将返回NULL
,并且目标数组将返回保持未初始化状态。
您的代码中没有任何东西阻止文件末尾的程序操作。只需在每个输入项后按Enter键。为什么您认为需要文件结尾信号?