【杂谈】关于getchar,Ctrl+Z,EOF的一些问题讨论

最近在读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实际上没有什么关系。

posted @ 2013-09-05 22:56  Azard  阅读(617)  评论(0编辑  收藏  举报