易百教程

控制台单个字符输入

stdio.h头文件中的getc()函数从流中读取单个字符。它返回字符代码类型为int
getc()的参数是流标识符。当读取流的末尾时,getc()返回值EOF(文件结束)。
EOF是在stdio.h文件中定义为负整数的符号。
getchar()函数一次从stdin读取一个字符,相当于以stdin作为参数调用getc()
getchar()函数在stdio.h中定义,其原型是:

int getchar(void);

getchar()函数不需要参数,它返回从输入流中读取的字符的代码,类型为int

getchar是以行为单位进行存取的
当调用getchar函数读取输入时,只有当输入字符为换行符'/n'或文件结束符EOF时,getchar才会停止执行,整个程序将会往下执行。并且,如果输入行是以EOF结束的(EOF之前不是换行符),则EOF会被“吃掉”(即不会被getchar读取到),如下面程序段:

while((c = getchar()) != EOF){
    putchar(c);
}

执行程序,输入:abc,然后回车。则程序就会去执行puchar(c),然后输出abc和一个回车。然后可以继续输入,再次遇到换行符的时候,程序又会把 那一行的输入的字符输出在终端上。令人迷惑的是,getchar不是以字符为单位读取的吗?那么,既然我输入了第一个字符a,肯定满足while循环(c = getchar()) != EOF的条件,那么应该执行putchar(c)在终端输出一个字符a。但是程序就偏偏不这样执行,而是必需读到一个换行符或者文件结束符EOF才进行一次输出。

造成这种结果的一种解释是,输入终端驱动处于一次一行 的模式下。也就是虽然getchar()putchar()确实是按照每次一个字符进行的。但是终端驱动处于一次一行的模式,它的输入只有到'/n'或 者EOF时才结束。在本例中,程序段调用了getchar函数,则控制权从程序段转移到getchar函数,而getchar函数要依赖于操作系统的驱动 来读取输入,没遇到换行符或者EOF,驱动不会通知getchar函数,getchar函数处于“阻 塞”状态。而遇到换行符或者EOF后,getchar函数解除“阻塞”,读取一个字符,控制权返回程 序段,执行putchar函数,循环执行。直到遇到EOF字符或者这行输入全部处理完。

getchar()的返回值一般情况下是非负值,但也可能是负值,即返回EOF。这个EOF在函数库里一般定义为-1。正确的定义方法如下:

int c;
c = getchar();