使用fgets()和stdin作为输入:^ D未能发出EOF信号

时间:2018-10-13 15:59:53

标签: c fgets eof

我正在使用Mojave在MacBook上用C语言编写一个程序,并且试图使用fgets()从stdin中获取字符串。

我的代码可以编译-唯一的问题是,当我在终端中运行程序时,在调用fgets()并键入所需的输入后,我不知道如何用信号通知输入结束该程序可以继续运行。

我认识到很多人都遇到过这个问题,并且该网站上有很多页面解决了这个问题。但是,所有解决方案(据我了解)都没有为我工作。我已经读过thisthis,但这些都无济于事。

我已经查看了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;
}

1 个答案:

答案 0 :(得分:2)

您不测试fgets()的返回值:如果确实从终端发出信号表明文件结束,则对fgets()的后续调用将返回NULL,并且目标数组将返回保持未初始化状态。

您的代码中没有任何东西阻止文件末尾的程序操作。只需在每个输入项后按Enter键。为什么您认为需要文件结尾信号