以下程序只是计算击键次数,直到到达 EOF,然后打印该计数。除非我在某个时刻按“Ctrl+Z”,否则它会按设计工作,这实际上会重置(清零)计数。为什么会发生这种情况?
#include <stdio.h>
int main(){
char ch;
int cnt = 0;
while ((ch = getchar()) != EOF)
{
cnt ++;
}
printf("%d",cnt);
return 0;
}
在这里,Ctrl+D 激活 EOF(注意最终计数包括空格):
但在这里,Ctrl+Z 将计数重置为零:
最佳答案
getchar() is buffered 。因此,每次按键时,循环都没有机会增加 cnt
。当您键入时,它保持为 0...并且直到您按下 Enter 或类似 Ctrl-D 之类的键后才会开始递增。
当您使用 Ctrl-D 时,它会继续并刷新输入 - 允许您的程序获取字符。但是,当您使用 Ctrl-Z 时,您会中断正在进行的行,并且您到目前为止输入的内容将被丢弃。所以你的循环不会运行。
正如 @JonathanLeffler 指出的那样,您的程序终止而不是暂停的事实是您的环境的某种产物。但是,如果您只是键入 fg
来恢复程序,您会在典型设置中看到相同的效果...您正在键入的行中正在进行的输入将丢失。
(在这种情况下添加更多 printf() 语句会有所帮助,例如在循环中添加更多 printf() 语句 - 使用 fflush(stdout)
保持谨慎 - 只是为了让你的每一步都影响系统的状态。)
关于Ctrl + z : why it resets count in C program that counts key strokes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53166660/