【问题标题】:using fgets() with stdin as input: ^D fails to signal EOF使用 fgets() 和 stdin 作为输入:^D 无法发出 EOF 信号
【发布时间】:2019-03-18 14:03:06
【问题描述】:

我正在使用 Mojave 的 MacBook 上用 C 语言编写程序,并且我正在尝试使用 fgets() 从标准输入中获取字符串。

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

我知道很多人都遇到过这个问题,而且这个网站上有很多页面都在解决这个问题。但是没有一个解决方案(我理解的)对我有用。我读过thisthis 但这些都没有帮助。

我查看了 fgets() 的文档,上面写着:

"fgets() 从流中最多读入一个小于 size 的字符,并将它们存储到 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;
}

【问题讨论】:

    标签: c fgets eof


    【解决方案1】:

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

    您的代码中没有任何内容可以阻止程序在文件末尾运行。只需在每条输入后按回车即可。为什么你认为你需要发出文件结束信号

    【讨论】:

      猜你喜欢
      • 2013-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-11
      • 2013-03-18
      相关资源
      最近更新 更多