Ctrl + z : why it resets count in C program that counts key strokes

标签 c

以下程序只是计算击键次数,直到到达 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(注意最终计数包括空格):

Screenshot: Ctrl+D activates EOF, note final count includes space

但在这里,Ctrl+Z 将计数重置为零:

Screenshot: Ctrl+D activates EOF, note final count includes space

这里显示了 ctrl+z 重置后计数如何从零继续: Screenshot: shows how count continues from zero after ctrl+z reset

最佳答案

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/

相关文章:

c - 使用 MACH-O 有没有办法注册一个将在 main 之前运行的函数?

c:当 1 维未知时 3d 数组的动态分配

c++ - 数组在*物理*内存中是连续的吗?

c - 将 '\0' 添加到非空终止 "string"的末尾

C 共享内存在结构体中传递结构体

c - 使用中序遍历查找二叉树中的最大元素

c - 字符串文字与 const char[] 或 char[] 之间的区别

c - 使用 select 循环与 fdisset

检查三元运算符是否存在的 C 程序

c - 如何防止缓冲区溢出/数组溢出?