char s[20]; 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’) |