循环中的 c=getchar(c))!=EOF 如何结束

循环中的 c=getchar(c))!=EOF 如何结束

作者:nullref | 出处:博客园 | 2011/12/17 15:58:16 | 阅读 91次

以下信息均为本人猜测,没有看到现实文档说明。

循环中可能出现下面这样的代码,它如何结束?

if((c=getchar(c))!=EOF){
...
}


我们理解编译器如何处理上面代码之前,先假想一下一个文本文件的构成
形式1
abc abc abc abc\n
abc abc abc abc\n
abc abc abc abc\n
abc abc abc
形式2
abc abc abc abc\n
abc abc abc abc\n
abc abc abc abc\n
abc abc abc\032

在形式1和形式2中每一行都由\n表示一行的结束,但结尾稍有不同:
1 形式1直接结束,没有任何结束标志。
2 形式2以字符\032结束。
其中形式2的结束符"\032"为DOS中文本文件的"文件结束符",符号"EOF",这与C中的"EOF"是一个形式上巧合。

VC对于"(c=getchar(c))!=EOF"的处理采用"形式1"的方式,即使用"\n"或"输入空"标志缓冲区有效字符结束。
MingW对于"(c=getchar(c))!=EOF"的处理采用"形式2"的方式,即使用"\n"或"\032"标志缓冲区有效字符结束。

简单讲代码中存在两种结束标志:
1 缓冲区有效字符结束的标志
2 函数本身输入结束的标志

"\n"永远做为getchar函数输入结束的标志,即上面的标志2。其他行为如下:
1 当以"\n"作为结束输入时,即代码写为(c=getchar(c))!='\n'时,"\n"既充当"缓冲区有效字符结束的标志(也就是说'\n'会进入缓冲区) "又充当"函数本身输入结束的标志"
2 当"前有有效字符后有^Z"的情况下,无论多少个"^Z",VC全部丢弃(VC使用上面的形式1)。
3 当"前有有效字符后有^Z"的情况下,无论多少个"^Z",MinGW全部丢弃,但在其尾部添加'\032'(MinGW使用上面的形式2)。
4 当只输入单个"^Z"时是个例外,VC与MinGW都将其定义为-1(即EOF)。

由上面说明MinGW可写出代码(c=getchar(c))!='\032'作为输入结束,但该种写法不能移植。

结论:
对于for中的(c=getchar(c))!=EOF的输入
1 输入应该输入字符后回车,再输入^Z并再次回车。
2 什么也不想输入,则^Z后回车

转载于:https://my.oschina.net/ljhUncle/blog/111461

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值