| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2308 人关注过本帖
标题:[求助]EOF与getchar()的问题
只看楼主 加入收藏
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
以下是引用喝茶的小k在2006-7-27 22:18:19的发言:

源程序如下:

#include<stdio.h>

void main()
{
long nc;
nc=0;
while(getchar()!=EOF)
++nc;
printf("%ld\n",nc);
}
为什么这个程序在vc++6.0下通过调试,但没有运行结果,输入后没反应

请教一下各位高人

程序完全正确,如lxs5216所说, 按ctrl+z或F6程序打印结果。


对不礼貌的女生收钱......
2006-07-28 13:04
喝茶的小k
Rank: 1
等 级:新手上路
帖 子:87
专家分:0
注 册:2006-7-27
收藏
得分:0 

谢谢大家!

我还想请问一下下面这个问题


#include<stdio.h>


void main()


{


long c,nc;


for(nc=0;c=getchar()!=EOF;++nc)


printf("%ld\n",nc);


}

这个程序在vc++6.0下的运行结果是这样的:

譬如输入asdfghjkl

输出结果为:

0

1

2

3

4

5

6

7

8

9

如果此时在按回车键每按一次数字就会加1会出现下面是每按一次回车的结果

10

11

12

.......

这有是为什么?请大家在解答一下


2006-07-28 14:12
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
首先程序有个错误。c=getchar()!=EOF;//改为(c=getchar())!=EOF,而且是char c,不是long c;
其实这里c可以去掉,它只被赋值却没在程序中被实际调用.即可改为getchar()!=EOF.
至于您问的那个问题,可以这样解释:
getchar()有这样一个特点,输入字符的时候,要按下回车表示输入的结束;但所有您从键盘输入的字符被先存储到键盘缓冲区(包括回车,至于键盘缓冲区这是系统为实现键盘中断开辟的),当您按下回车,getchar()函数执行结束(但循环并没有退出),于是开始执行下面的程序,于是依次计算输入的字符数,其实这里回车也是被计算了的,只是您把nc的初值赋为0,看起来就没计算回车罢了。
在您再单独按回车的时候,键盘缓冲区仍把回车记录,getchar()接收了回车,但仍不满足循环退出的条件,于是仍往下执行程序,进行记数.


对不礼貌的女生收钱......
2006-07-28 14:30
喝茶的小k
Rank: 1
等 级:新手上路
帖 子:87
专家分:0
注 册:2006-7-27
收藏
得分:0 

在请教一下soft_wind

我的循环条件是(c=getchar())!=EOF,如果我在输入结束后按下回车键,输出结果和上面的一样但此时我按

Ctrl+z(EOF=),屏幕出现Press any key to continue循环看来是结束了(运行试试按Ctrl+F5,环境为vc++6.0)

但我输入结束后直接按Ctrl+z,循环按道理应该结束了,但我稀释再按回车,就会出现和12楼一样的情况

这又是为什么?谢谢


2006-07-28 14:47
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
您说的我没理解,您能再说明白些?
不过,您既然用(c=getchar())!=EOF来作为循环输入的条件,那么按回车是退不出循环的,
只有按Ctrl+z才能退出循环.还有,所有的输入函数其实都是通过从键盘缓冲区中接收数据的。

对不礼貌的女生收钱......
2006-07-28 14:56
喝茶的小k
Rank: 1
等 级:新手上路
帖 子:87
专家分:0
注 册:2006-7-27
收藏
得分:0 

(c=getchar())!=EOF作为循环条件,按Ctrl+z应该会使循环结束,但我输入结束后,按Ctrl+z

屏幕上会显示~Z的字样,要看到结果再按一下回车,但结果和12楼的一样,循环似乎没结束

谢谢


2006-07-28 15:03
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
getchar()回显字符,自然会出现^z的字样,按下回车,getchar()才能从键盘缓冲区中接收EOF(ctrl+z),
这时循环结束。再按任何键即退出程序。

对不礼貌的女生收钱......
2006-07-28 15:16
神经塔
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:1986
专家分:4
注 册:2006-7-1
收藏
得分:0 
可以用fflush(stdin)

[shadow=255,red,2]待到秋来九月八,我花开时百花杀。冲天香阵透长安,满城尽是黄金甲。 [/shadow]
2006-07-29 09:15
喝茶的小k
Rank: 1
等 级:新手上路
帖 子:87
专家分:0
注 册:2006-7-27
收藏
得分:0 
谢谢

2006-07-29 09:21
mikewolf
Rank: 1
等 级:新手上路
帖 子:175
专家分:0
注 册:2004-7-3
收藏
得分:0 
因为我们所写的程序在操作系统中以文件的形式存在,
所以字符的表示与操作系统有关。
而编译程序又是工作于操作系统环境下的,
其功能就是翻译我们的程序文件到目标文件。
据我所知,回车键在不同的操作系统中有不同的表示:
unix环境:\n=12H
windows环境:\n=15H12H.
macintosh环境:\n无定义;
而编译程序为避免不同的环境的影响。
一般通过内建的表示方法表示回车键!
2006-07-29 12:37
快速回复:[求助]EOF与getchar()的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011713 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved