键盘输入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()函数的 (待续)




  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值