getchar和EOF

时间:2016-12-18 20:08:52

标签: c

我正在研究以下来自Deitel& amp;的C代码示例。 Deitel公司。似乎代码应该以相反的顺序打印在EOF之前输入的字符。但我必须多次按EOF(在Windows中按ctrl + z)并按Enter键才能完成。能不能让我知道为什么它在第一次EOF时没有回应?

 #include <stdio.h>

 int main( void )
 {
     int c;
     if ( ( c = getchar() ) != EOF ) {
         main();
         printf( "%c", c );
     } /* end if */

     return 0; 
 } 

2 个答案:

答案 0 :(得分:1)

getchar(3)是一个在缓冲模式下运行的函数,所以你必须输入一些字符,并按下用于表示数据结束的字符(^中的^ D,windows中的^ Z)

这里的问题是windows控制台驱动程序的指定方式与unix tty驱动程序的方式不同,因此一般情况下行为不一样...尝试在真正的unix环境中测试程序(或linux)并查看输入,至少是否反转,如示例所示。

在unix中,终端输入的行为是^D在被按下时被解释,但如果某个输入在它之前的驱动程序缓冲区中,它将使这些输入可用于程序(所以您必须再次按下它以发出EOF条件,其中包含导致read(2)字符实际读取的0条件。如果您在<Return>之前按下了^D(返回使所有数据可用于应用程序,区别在于\n字符也附加到数据读取),则输入缓冲区为为空,EOF条件在<return> char。

之后立即生效

在Windows中,您需要按<return>才能读取任何内容(要解释的^Z),事情会变得复杂。

顺便说一句,我已经在BSD unix系统上执行了你的程序,结果如下:

$ a.out
apsiodjfpaosijdfa
^D
afdjisoapfjdoispa$ _

说明:第一行是输入行“apsiodjfpaosijdfa”,后跟\n^D信号输入结束。所有这些数据立即传递给应用程序,getchar()然后逐个字符地处理它。它首先打印\n(使行显示在^D下方),然后输入字符,反转。由于数据开头没有\r,因此最后不会发出返回,并且输出旁边会显示提示。 最后_表示光标在末尾的位置。

如果您不想处理数据字符结尾(或者手头没有任何unix来进行测试),您可以使用文本文件来测试您的程序(没有eof char,只有实际结束(通过重定向文件中的程序输入),例如在此示例中使用原始源代码作为输入:

$ a.out <pru.c

}
;0 nruter     

/* fi dne */ }     
;) c ,"c%" (ftnirp         
;)(niam         
{ ) FOE =! ) )(rahcteg = c ( ( fi     
;c tni     
{
) diov (niam tni

>h.oidts< edulcni#$ _ 

答案 1 :(得分:0)

它们与Windows控制台将CTRL + Z传递给程序的方式有关。它可能正在等你组成一条线而不识别一条线,直到它有一个非CTRL-Z字符。所以它等到你不小心按空格并进入。

只需回显临时程序中的所有内容,即可确切了解正在发生的事情。