getchar()和EOF总结

我看了其他的博客关于getchar()和EOF,我自己琢磨后,把感觉没有用的删除了,有必要记住的增添进去了。
#define  EOF  -1  
如果以下有不对的地方请指正,谢谢。

一、 getchar是以行为单位进行存取的。

当用getchar进行输入时,如果输入的第一个字符为有效字符(即输入是文件结束符EOF,Windows下为组合键Ctrl+Z, Unix/Linux下为组合键Ctrl+D),那么只有当最后一个输入字符为换行符'/n'(也可以是文件结束符EOF,EOF将在后面讨论)时, getchar才会停止执行,整个程序将会往下执行。拿下面程序段:

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


第一种输入:执行程序输入:abc,然后回车。
程序输出是:
等待用户的输入。
第二种输入:当你这样输入的时候: abc ctrl+z
会发现并没有结束输入为什么?

对这个问题的一个解释是,在大师编写C的时候,当时并没有所谓终端输入的概念,所有的输入实际上都是按照文件进行读取的,文件中一般都是以行为单位的。
因此,你在终端的输入比如:abc ctrl+z, 缓冲区先把这读你输入的数据,每次读一行,它遇到 '\n' EOF 符号结束读入,但是不同的是缓冲区
1.遇到 '\n'  时,是把该字符读到缓冲区,停止读入
2. 遇到 EOF时,把该字符舍弃,停止读入
所以对于第一种情况,缓冲区结束时候的内容为:abc+换行符
对于第二种情况,缓冲区结束时候的内容为:abc     //EOF根本没有读入,只是作为结束该行输入的标志而已
 
第三种输入:abc 换行符 ctrl+z
为什么在新的一行行首输入  EOF ,会被getchar()函数接收呢?
这与getchar()函数的实现机制有关,在终端下接收EOF的情况就是这样规定。

 
二、getchar()函数的返回值问题
getchar() 返回值有三种情况:
1. 正常读入时候,返回 读入的字符
2. 遇到EOF是,返回-1 即EOF
3. 非正常读入,比如:特殊情况下没有读到什么也没有读到,返回 仍是 EOF
下面的这个我也没有试验。转载别人写的,大家可以试试。
【补充】本文第二部分中关于EOF的总结部分,适用于终端驱动处于一次一行的模式 下。也就是虽然getchar()和putchar()确实是按照每次一个字符 进行的。但是终端驱动处于一次一行的模式,它的输入只有到“/n”或者EOF时才结束,因此,终端上得到的输出也都是按行的。
如果要实现终端在读一个字符就结束输入的话,下面的程序是一种实现的方法(参考《C专家编程》,略有改动):

/*Edit by Godbach
  CU Blog: http://blog.chinaunix.net/u/33048/
*/

# include < stdio. h>
# include < stdlib. h>

int
main( void )
{
    int c;
    /* 终端驱动处于普通的一次一行模式 */
    system ( "stty raw" ) ;
   
    /* 现在的终端驱动处于一次一个字符模式 */
    c = getchar ( ) ;
    putchar ( c) ;
   
    /* 终端驱动处又回到一次一行模式 */
     system ( "stty cooked" ) ;
   
    return 0;
}

编译运行该程序,则当输入一个字符时,直接输出一个字符,然后程序结束。
由此可见,由于终端驱动的模式不同,造成了getchar()输入结束的条件不一样。普通模式下需要回车或者EOF,而在一次一个字符的模式下,则输入一个字符之后就结束了。

你可能感兴趣的:(c,windows,include,终端,getchar)