键盘输入EOF, 为何循环还不停止

在K&R的C语言教程里看到这段程序,关于输入字母计数的程序,如下:

#include<stdio.h>
void main()
{
  long coff=0;
  while(getchar()!=EOF)
     coff++;
  printf("%ld\n",coff);
}

代码不复杂,只有在键盘输入EOF键时,循环才会结束。

那么如何才能从键盘输入EOF呢?(我的编程环境是 windows 7 + visual studio 2010)

查了一下资料: 

http://bbs.csdn.net/topics/310129688

http://en.wikipedia.org/wiki/End-of-file

发现在Windows 下,输入 ctrl+z 或者F6 键是可以代表EOF的,但是具体的情况有点怪异。

例如输入 “abcd^z 回车” 时,程序还在继续,继续后在新的一行输入 “^z 回车” 时,程序才结束,输出5。 

如果输入  “abcd^Z^Z^Z 回车 ^Zefg 回车” ,  还是输出5。这说明:

  1. 第一行内的三个^Z^Z^Z并没有算三次;
  2. 第二行开头的^Z后面三个字母efg 并没有计算到coff里,也就是说,程序运行到了接收字母e 时,已经跳出了循环
  3. abcd 四个字母,再加一次回车,所以输出是5 (如果中间输入两次回车,也就是“abcd^Z^Z^Z 回车 回车 ^Zefg 回车”输出是6,就说明)
  4. while循环遇到^Z开头的新的一行就结束了,无论后面有多少字母,这些输入的字母都没有影响到coff的值


归纳一下上述第一个讨论链接的内容,可以大概这样理解EOF:

在行缓冲里,如果EOF前面还有字符,那么操作系统不会产生EOF,只有前面没有任何字符的时候才会产生。


然后这是另一个小节,关于putchar()函数的 (待续)




你可能感兴趣的:(键盘输入EOF, 为何循环还不停止)