我正在研究以下来自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;
}
答案 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字符。所以它等到你不小心按空格并进入。
只需回显临时程序中的所有内容,即可确切了解正在发生的事情。