以下是引用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 编辑 ]