| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 647 人关注过本帖
标题:请教一下 getchar()的问题
只看楼主 加入收藏
雨幕
Rank: 1
等 级:新手上路
帖 子:6
专家分:4
注 册:2014-10-22
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:11 
请教一下 getchar()的问题
char A,B,C,m,n,k;
    while(scanf("%c%c%c",&A,&B,&C))
{      getchar();
    m=A>B?A:B;
    m=m>C?m:C;
    n=A<B?A:B;
    n=n<C?n:C;
    k=A+B+C-m-n;
   
    printf("%c %c %c\n",n,k,m);
    n=m=k=0;
}
return 0;   
}      
第一次没红色的getchar  程序只有第一轮运行正确   加了getchar后 都对了  但我不是很理解   求大大们解释一下
2014-10-24 19:26
soulmate1023
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:256
专家分:831
注 册:2014-9-23
收藏
得分:2 
这是因为你在输入数的时候,最后按了回车,所以要用getchar()把输入缓冲区清空的。
2014-10-24 20:09
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:8 
以下是引用soulmate1023在2014-10-24 20:09:00的发言:

这是因为你在输入数的时候,最后按了回车,所以要用getchar()把输入缓冲区清空的。

如果用户敲了多下回车呢?或者输入了多个无效数据呢?

授人以渔,不授人以鱼。
2014-10-25 12:11
soulmate1023
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:256
专家分:831
注 册:2014-9-23
收藏
得分:0 
回复 3 楼 TonyDeng
能不能用fflush(stdin)? 但这个是不是只能在vc上用呀?
2014-10-25 15:31
soulmate1023
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:256
专家分:831
注 册:2014-9-23
收藏
得分:0 
回复 3 楼 TonyDeng
查了下资料,如果用户输入多个无效数据,就用
int c;
while((c=getchar())!='\n'&&c!=EOF) ;
清空缓冲区
但是,如果用户输入多个回车呢?
c=getchar();
while(c=='\n')
c=getchar();
这样可以吗?

版主,其实我还有一个问题,就是在楼主这个例子中,我知道getchar()是用来清空缓存的,那我其实认为这个回车副不影响什么呀,因为他程序后来也没有别的输入函数,就不会存在再从输入缓存中读取数据了呀,这里为什么还必须加上???
版主版主,求指导~~~~~~~~~~
收到的鲜花
  • 雨幕2014-10-26 20:59 送鲜花  3朵   附言:好文章
2014-10-25 15:58
Sv少
Rank: 3Rank: 3
来 自:山东青岛
等 级:论坛游侠
威 望:1
帖 子:53
专家分:168
注 册:2011-11-7
收藏
得分:0 
scanf("%c%c%c",&A,&B,&C)应该就是他的问题!
仔细看一下百度百科scanf就知道了,好像在注意事项里面

Sv少  run
2014-10-25 18:31
qq450255457
Rank: 1
等 级:新手上路
帖 子:2
专家分:3
注 册:2014-8-16
收藏
得分:0 
回复 6 楼 Sv 少
此楼正解!
2014-10-25 18:53
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用soulmate1023在2014-10-25 15:31:25的发言:

能不能用fflush(stdin)? 但这个是不是只能在vc上用呀?

C标准并没有规定输入流如何清空(输出流倒是有的),这由编译器自由处理,相应的,大多数编译器都提供类似fflush(stdio)这样的函数(具体函数名可能会有变化,但功能是一样的)。另外,由于stdin的流设备,所以流文件处理的函数也是可以用的,一种与fflush()功能相同的做法是rewind(stdin),即把文件指示器复位到开头,stdin设备内置会处理相应的问题。

授人以渔,不授人以鱼。
2014-10-25 20:12
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用soulmate1023在2014-10-25 15:58:54的发言:

查了下资料,如果用户输入多个无效数据,就用
int c;
while((c=getchar())!='\n'&&c!=EOF) ;
清空缓冲区
但是,如果用户输入多个回车呢?
c=getchar();
while(c=='\n')
c=getchar();
这样可以吗?
 
版主,其实我还有一个问题,就是在楼主这个例子中,我知道getchar()是用来清空缓存的,那我其实认为这个回车副不影响什么呀,因为他程序后来也没有别的输入函数,就不会存在再从输入缓存中读取数据了呀,这里为什么还必须加上???
版主版主,求指导~~~~~~~~~~


一样有问题。这种做法,当启动循环后,如果此时输入缓冲区中没有数据,getchar()就会死等输入而不会继续运行下去,用户看起来就不知道电脑在等什么。问题的本质是你无法预知输入缓冲区中有没有数据、以及有多少数据是需要忽略的——你不要以为遇到一个'\n'退出循环就可以了,事实上可能有多段垃圾数据等着你废除,而这个循环只是废掉了一段而已。stdin就是一个文本文件,你可以假想,用户事先已经在文件中灌入了一大篇文章,你这个循环处理得了?可能有人会说,用户不可能一次键入多段(每回车一次为一段)的数据。这就错了!操作系统支持输入输出重定向,从键盘中键入数据与用<符号灌入文件数据是完全等效的。

输入数据末尾的回车符,确实不影响当前的输入流程,但多余的数据,是留到下一次调用输入流函数时起作用的,此时麻烦之处就是你无法预知下一次调用流输入函数是在什么时候、以及下一次输入需要什么数据。很多时候,用户会一次性输入所有要求的数据后才敲回车,并非所有输入都理应被废弃:用for()循环3次调用getchar()等效于在3个不同的地方各调用1次getchar()。

程序的健壮性和可用性,取决于你设计的用户交互界面,用流函数getchar()/scanf()之类制作人机对话界面,注定要碰到无数难以处理的问题,这时你只能寄希望于用户培训,让用户主动回避。的确,在远古时代,程序就是这样强制用户的,尤其是C语言的设计者,它面向的用户就是程序员本身,他们自己使用C语言,当然知道该如何回避,但这正是历来说旧程序不友好的根源,不然人家兴起各式各样的友好界面干什么。不要假定你写的程序都由程序员使用,那些只能按固定格式编制和处理数据的程序以及由此训练出来的思维,在实践中必定碰壁,除非你根本就不打算与活生生的人打交道。


[ 本帖最后由 TonyDeng 于 2014-10-25 20:51 编辑 ]

授人以渔,不授人以鱼。
2014-10-25 20:35
soulmate1023
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:256
专家分:831
注 册:2014-9-23
收藏
得分:0 
回复 6 楼 Sv 少
懂了,谢啦
2014-10-25 20:44
快速回复:请教一下 getchar()的问题
数据加载中...
 
   



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

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