循环中的 c=getchar(c))!=EOF 如何结束
以下信息均为本人猜测,没有看到现实文档说明。
循环中可能出现下面这样的代码,它如何结束?
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后回车