最近在读K&R,故开此栏,希望能早点读完这一本C的巨作。
在1.5中,作者讨论了EOF,getchar()的一系列问题,我在测试过程中发现了关于ctrl+Z以及EOF的一些问题,改变了我之前的理解。
先看个例子
#include <stdio.h> main() { long nc = 0; int c; while ((c = getchar()) != EOF) { printf("int c:%d\n", c); ++nc; } printf("int c:%d\n", c); printf("%ld\n", nc); }
我一共进行2次输入:
(1) 123
int c:49
int c:50
int c:51
int c:10
^Z
int c:-1
4
第一次输入没有任何疑问,读取了1,2,3,\n,并且^Z被解读为-1。
(2) 123^Z456
int c:49
int c:50
int c:51
int c:26
此时,程序没有结束,说明读取到^Z时的返回值并不是EOF,并且后面的456没有读取,当我再新一次输入^Z的时候,程序结束了。
到此,我产生了2个疑问:为什么第二下在字符串中间输入的^Z被读取为26而不是EOF?为什么456没有被读取?
http://bbs.csdn.net/topics/310129688 这个帖子关于这个问题有详细的讨论
进过本人测试,可以将这个问题总结为一下几点:
(1) ctrl^Z并不能简单的看做EOF,它是模拟EOF的一种输入方式,查看ASCII表知道ctrl+Z表示0x1A(右箭头),字符归字符,EOF归EOF。
(2) getchar()是否返回EOF不仅仅是读取到0x1A,还要根据前文对应,判断返回0x1A还是-1。
(3) 如果一次输入前面有字符,则Ctrl+Z判断为0x1A,但是忽略这一次输入缓冲区的后面全部字符,0x1A本身也起到了\n的作用。
(4) 如果一次输入前面没有字符,Ctrl+Z是第一个字符,则getchar()将其看做EOF,返回-1。
具体到更深层次的getchar()的实现,系统的流是怎么回事?我现在还没有进行详细的学习。暂且区别清楚EOF和ctrl+Z或者ctrl+D实际上没有什么关系。