为什么getchar()没有读取退格等字符?

这是一个非常基本的C问题,来自Kernighan和Ritchie的第18页.

我编译了这个非常简单的代码来计算从键盘输入的字符:

#include <stdio.h>

/* count characters in input; 1st version */
main()
{
  long nc;

  nc = 0;
  while (getchar() != EOF)
    ++nc;
  printf("%1d\n",nc);
}

这个编译很好,运行正常,并且表现得非常符合预期,即如果我输入“Hello World”,当我按CTRLD给出EOF字符时,它返回值11.

令我困惑的是,如果我犯了错误,我可以使用退格键删除字符并重新输入它们,并且它只返回当我调用EOF时终端显示的字符数.

如果代码计算每个字符,包括特殊字符,如果我键入四个字符,删除两个,并键入另外两个,不应该输出为8个字符(4 char 2 del 2 char),而不是4?

我显然误解了C如何处理退格,以及代码如何/何时递增变量nc?

解决方法

通常,您的终端会话以“行模式”运行,也就是说,它只在行完成时将数据传递给您的程序(例如,您按下Return等).因此,您只能在完成后看到该行(在您的程序看到任何内容之前已完成任何编辑).通常这是一件好事,所以每个程序都不需要处理delete / etc.

在大多数系统(例如基于Unix的系统等)上,可以将终端置于“原始”模式 – 也就是说,每个字符都按接收方式传递给程序.例如,面向屏幕的文本编辑器通常会这样做.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...