getchar和EOF

getchar和EOF,c,C,我正在研究Deitel&Deitel的以下C代码示例。代码似乎应该以相反的顺序打印在EOF之前输入的字符。但我必须按EOF(windows中的ctrl+z)几次,然后输入key才能完成。你能告诉我为什么它在第一次EOF时没有响应吗 #include <stdio.h> int main( void ) { int c; if ( ( c = getchar() ) != EOF ) { main(); printf( "

我正在研究Deitel&Deitel的以下C代码示例。代码似乎应该以相反的顺序打印在EOF之前输入的字符。但我必须按EOF(windows中的ctrl+z)几次,然后输入key才能完成。你能告诉我为什么它在第一次EOF时没有响应吗

 #include <stdio.h>

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

     return 0; 
 } 
#包括
内部主(空)
{
INTC;
如果((c=getchar())!=EOF){
main();
printf(“%c”,c);
}/*如果结束*/
返回0;
} 

这与windows控制台将CTRL+Z传递给程序的方式有关。它可能在等待您组成一行,直到其中有一个非CTRL-Z字符时才识别该行。所以它会一直等到你不小心按下空格键并输入

只需回显scratch程序中的所有内容,就可以准确地看到发生了什么。

好的
getchar(3)
是一个在缓冲区模式下运行的函数,因此您必须输入一些字符,然后按用于表示数据结束的字符(^D在unix中,^Z在windows中)

这里的问题是,windows控制台驱动程序的指定方式与unix tty驱动程序的指定方式不同,因此通常情况下,其行为将不同。。。尝试在真实的unix环境(或linux)中测试该程序,看看输入是否至少是反向的,如示例所示

在unix中,终端输入的行为是,
^D
一按下就被解释,但如果某个输入在它之前的驱动程序缓冲区中,它将使这些输入可供程序使用(因此您必须再次按下它以发出
EOF
条件的信号,该条件包含
读取(2)
导致
0
字符实际读取)。如果在
^D
之前按了
(return使应用程序可以使用所有数据,不同的是
\n
字符也会附加到读取的数据中),则输入缓冲区是空的,因此
EOF
条件会在
字符之后立即出现

在windows中,您需要按
来读取任何内容(要解释的
^Z
),而事情会变得复杂

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

$ a.out
apsiodjfpaosijdfa
^D
afdjisoapfjdoispa$ _
说明:第一行是输入行“apsiodjfpaosijdfa”,后面是一个
\n
^D
表示输入结束。所有这些数据一次进入应用程序,
getchar()
然后逐字符处理。它首先打印
\n
(使行显示在
^D
下面),然后反向打印输入字符。由于在数据的开头没有
\r
,因此在结尾不会发出返回,并且在输出旁边会出现提示。 最后一个
表示光标在末端的位置

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

$ a.out <pru.c

}
;0 nruter     

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

>h.oidts< edulcni#$ _ 
$a.out h.oidts
该代码不是一个很好的示例。你不应该递归调用
main
。那么“scanf”(在标题中提到)与这个问题有什么关系呢?
Ctrl-Z
必须是第一个条目,或者是
换行后的第一个条目。使用
scanf
时,必须按三次组合键
Ctrl-Z
,我仍然不清楚原因。@Someprogrammerdude发现递归调用
main
在技术上没有问题。对于一个小的示例程序,我想它是可以的@Schwern,你是正确的,不像C++中(调用<代码>主())/代码>被明确禁止的,在C中调用<代码>主()/<代码>不被标准禁止。但我不会说‘从技术上讲,它没有什么问题’;这仍然是一个坏主意-例如,
main()
不是(从内存中)强制返回的。