首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >getchar和EOF

getchar和EOF
EN

Stack Overflow用户
提问于 2016-12-19 04:08:52
回答 2查看 153关注 0票数 2

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

代码语言:javascript
复制
 #include <stdio.h>

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

     return 0; 
 } 
EN

回答 2

Stack Overflow用户

发布于 2016-12-20 02:36:03

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

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

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

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

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

代码语言:javascript
复制
$ a.out
apsiodjfpaosijdfa
^D
afdjisoapfjdoispa$ _

Explanation:的第一行是输入行"apsiodjfpaosijdfa",后面是一个\n,以及^D信令的输入端。所有这些数据都会立即传送到应用程序,然后getchar()逐个字符地处理这些数据。它首先打印\n (使该行显示在^D下面),然后反转打印输入字符。由于数据开头没有\r,因此在结束时不会发出任何返回,并且会在输出旁边显示提示。最后的_表示光标在末尾的位置。

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

代码语言:javascript
复制
$ 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
EN

Stack Overflow用户

发布于 2016-12-19 06:48:33

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

只需在scratch程序中回显所有内容,即可查看到底发生了什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41212379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档