以 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。所以显然我的讲师在她的解决方案中使用了一个错误。
我正在尝试在完成未定义数量的另一个输入后获取用户输入。但问题是 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。所以显然我的讲师在她的解决方案中使用了一个错误。