scanf 在到达最后一个输入之前返回 EOF [duplicate]

scanf returns EOF before last input is reached [duplicate]

提问人:avivgood2 提问时间:3/30/2020 最后编辑:Acornavivgood2 更新时间:3/30/2020 访问量:66

问:

我正在尝试收集数字,直到达到 EOF,然后将数字转换为英语。

$ ./dtoa
22 
twenty two

以下是该计划的一部分:

int num;
while(scanf("%d", &num) != EOF)
        to_string(num);

问题是,当我输入输入,然后按EOF时,最后一个数字实际上不会被打印出来:CtrlD

$ ./dtoa
22 33 44(EOF) twenty two
 thirty three(EOF)
 forty four

我需要按最后一个数字才能显示。如何修复它,以便将完整输入插入到第一个 EOF 中?CtrlD

C 输入 扫描 EOF

评论

1赞 M.M 3/30/2020
再按 ^D 几次。这是终端的一个属性(在一行中按下它意味着刷新输入,而不是关闭流)

答:

2赞 Acorn 3/30/2020 #1

要实际发送“EOF”(关闭流),必须在换行符之后按。CtrlD

否则,终端将发送缓冲字符(与 相同,但不添加 )。Enter\n

评论

0赞 avivgood2 3/30/2020
当我在插入输入后按回车键时,程序没有给我输入EOF的机会,并立即提交号码。因此,在它完成程序终止的数字后,等待我进入EOF。
0赞 Acorn 3/30/2020
@avivgood2 这是意料之中的:首先,您按下发送输入,该输入由第一个处理,然后程序再次等待更多输入,然后在那一刻您按下终止流,这使得第二个调用返回。EnterscanfCtrlDscanfEOF