以 EOF 结尾的 fgets 循环跳过下一个 fgets

fgets loop ending with EOF skips next fgets

我正在尝试在完成未定义数量的另一个输入后获取用户输入。但问题是 while 循环之后的第二个 fgets 永远不会被调用。我用 EOF 结束循环,也许这就是错误所在。但我不知道我还应该如何结束循环。

另一个有趣的事情是:这是我的 C 编码任务 class 并且讲师有她的解决方案的视频,如果我正在复制她的代码 1:1,它也不会工作。它还会跳过第二个 fgets 调用。

我已经将代码缩减到绝对最低限度以解决错误,但如您所见:几行代码并不起作用。我什至尝试用 GDB 调试它,但我不知道如何让它像视频中那样表现。

#include <stdio.h>
int main() {
    char input[80];
    while (fgets(input, 80, stdin) != NULL) {
        // nop
    }
    fgets(input, 80, stdin);
    printf("%s\n", input);
    return 0;
}

当你在 mac 中第一次按下 ctrl+d = EOF 时(在 windows 上我猜是一样的)你不得不退出 while 循环。

当你再次按下它时,循环后的 fgets 会打印最后一行。

对不起我的英语:)

对于 LINUX 和 UNIX 系统,对于 windows 是 ctrl +D 和 ctrl + z。您可以使用以下代码对其进行测试。

#include <stdio.h>
int main() {
    char input[80], input1[50];
    while (fgets(input, 80, stdin) != NULL) {
        // nop
    }   
        fgets(input1, 50, stdin);
    printf("input is %s\n", input);
        printf("input1 is %s\n", input1);
    return 0;
}

此外,请在 post 中提及您的系统以进一步说明

更新:我找到问题了!发现在代码运行的每个 OS 上,libc 的版本为 2.27。在所有其他系统上,libc 的版本为 2.29。因此,我在 libc-2.27 系统上使用 -static 选项编译了代码,并使用 libc-2.29 将其复制到我的主系统中,并且一切正常! 所以现在我只需要弄清楚如何在 Manjaro 上将我的 libc 降级到 2.27。

编辑:收到开发人员的邮件。他们说它在我的系统上的行为方式是正确的方式并链接到提交 2cc7bad0ae。所以显然我的讲师在她的解决方案中使用了一个错误。