gcc编程 linuxc下scanf,getchar读入单字符时,容易 scanf getchar 混用

输入字符紧跟前面一个输入字符串或输入字符,会造成连读(“假读”).读入前面输入后I/O缓存留下的n'
char s[20];
[gcc编程]linuxc下scanf,getchar读入单字符时,容易 scanf getchar 混用
char c;

while(1)
{
printf("input c:");
scanf("%c",&c);
printf("input s[20]:");
scanf("%s",s);

printf("c value is : %cn",c);
printf("s value is : %sn",s);
}
input c:h
input s[20]:dd
c value is : h
s value is : dd
input c:inputs[20]:6连读,C没有读直接就过了.(等于是把前面dd的n读了)
c value is :

s value is : 6


解决办法:读入字符时,循环检验输入不等于n
如果读入的是回车,就重新读,直至读到非回车字符
scanf("%c",&c);
while(c=='n') scanf("%c",&c);


iobuffer 问题 1:前面scanf %c读入多字符时,会把多余的字符留在i/obuffer,也会对后面的scanf读入造成”假读”
inputc:ui
input s[20]:

c value is :u假设此时输入时手误,其实输入的是“ui”
s value is :i造成字符串"假读"
没有什么特别好的解决办法.


iobuffer问题2:scanf(%d) ,如果输入非数字, 系统会接受整数,将字符留在iobuffer,造成后面scanf(%s)的字符串"假读"
input no. ------->3_
input name. ------->your input is
input no. ------->3t
input name.------->your input ist

解决办法: 尽量都用字符串输入(%s),然后checknumber(自己编的函数,自己定义该检查什么,比如检查输入不是0-9,就继续循环读),然后转换成字符和数字.避免用字符输入和整形输入


I/Obuffer解决办法的本质---都是在输入后面用while判定来检验输入的字符的有效性
c=getchar();
while((c!='y')&&(c!='Y')&&(c!='n')&&(c!='N'))c=getchar();
检测只允许输入y/n
scanf("%s",c);
while (!checknumber(c))scanf("%s",c);
检测只输入数字(字符,’0’—‘9’)





  

爱华网本文地址 » http://www.aihuau.com/a/25101011/94470.html

更多阅读

转载 当你心情不好时,读一读它 九上语文读一读写一写

原文地址:当你心情不好时,读一读它作者:白头翁当你心情不好时,读一读它佛学的181条智慧一、人之所以痛苦,在于追求错误的东西。 二、与其说是别人让你痛苦,不如说是自己的修养不够。 三、如果你不给自己烦恼,别人也永远不可能给你烦

声明:《gcc编程 linuxc下scanf,getchar读入单字符时,容易 scanf getchar 混用》为网友待定分享!如侵犯到您的合法权益请联系我们删除