关于C语言中的getchar()疑问(望有耐心者进),谢谢。

下面三张图中,第一张是源代码,第二张、第三张的比较是问题所在。具体是这样的:第二张图片中我把adc和EOF(ctrl+z)及回车,输入进缓存,执行循环输出,程序没有终止;... 下面三张图中,第一张是源代码,第二张、第三张的比较是问题所在。
具体是这样的:第二张图片中我把adc和EOF(ctrl+z)及回车,输入进缓存,执行循环输出,程序没有终止;而第三张图片中我直接把EOF(ctrl+z)及回车,输入进缓存,程序结束了。我想知道为什么会有这样的差别。根据我定义的循环,第二张图中读到EOF应该就终止循环了,可是为什么程序还是保持在等待输入状态?

另外的问题:很多书本中说的EOF值为-1是什么意思?具体怎么用?为什么键盘输入ctrl+z也会是结束呢?
展开
 我来答
ok洛阳水席
2013-05-29 · TA获得超过1839个赞
知道小有建树答主
回答量:580
采纳率:50%
帮助的人:519万
展开全部

怎么说呢……在windows操作系统下用ctrl+z可以结束程序,因为相当于输入ctrl+z就相当于输入结束 就是说文件中所谓的EOF……
但有一定的要求,就是ctrl+Z要放在行首,因为如果输入缓冲区中有可读的数据系统不会检测Ctrl+Z,对于Ctrl+Z我在书上,网上看到的解释都是这样:Ctrl+Z产生的不是一个普通的ASCII码值,也就是说它产生的不是一个字符,所以不会跟其它从键盘上输入的字符一样能够存放在输入缓冲区。这个意思就是按下回车后系统会先检测Ctrl+Z如果第一个就是Ctrl+Z就会结束,而第一个遇到能读的数据的话,系统就是读输入缓冲区里的数据,而不会检测Ctrl+Z了。

也就是说Ctrl+Z在行首才会生效。 换句话说只要系统检测到输入缓冲区中已经有数据存在,就不再检查是否有 ^z 的输入。不过中间的Ctrl+Z依然能起到屏蔽后面的数据的效果。


至于EOF,书上网上都有,在C语言中,或更精确地说成C标准函数库中用来表示文件结束符的,展开就是End Of File。不过用EOF作为文件结束标志的文件只有文本文件。因为文本文件里面的数据都是用字符的ASCII代码值的形式存放的。而ASCII代码值的范围是0~255,没有-1,所以可以用EOF来作为文件结束标志,而其他文件如二进制文件都是不行的!实际上,EOF 的值通常为 -1,但是系统不同的话,EOF的值是可能不同的!其实C语言中还有个feof来判断其他类型的文件是否结束,有兴趣可以看下。

表达能力有限……

jim2zj2zj
2013-05-29 · 超过31用户采纳过TA的回答
知道答主
回答量:122
采纳率:100%
帮助的人:85.5万
展开全部
关键就出在“输入进缓存”这个概念的理解上

你的理解应该是这样的:按键输入a,代码就执行getchar,读到这个a,然后在按键输入d以后,代码又执行getchar,读到这个d,然后读到EOF就应该结束。

实际上不是这样的,输入的内容是以回车结尾,作为输入的结束,然后代码开始循环处理adc....这个串,先getchar到一个a,再getchar到一个d。。。。所以你不敲回车,程序还处于输入的阶段,连while循环都没有执行到,当然更不会结束

另外EOF的问题,不同的系统内部值有所不同,不用纠结于为何一定是-1,只要理解它是一个结尾就ok了。另:我在xp+vc6下试验的时候,ctrl+z并不是作为EOF的?
追问
我在百度百科上了解到getchar:如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键.

此时后续getchar调用是否已经不执行while中的条件判断了么?

我电脑win7 + vc++6.0 ctrl+z可以结束程序的。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式