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();