Scanf()—键盘缓冲区残余信息和误输入造成程序死锁或出错问题
一、处理键盘缓冲区残余信息问题
1 #include <stdio.h>
2 int main(void)
3 {
4 int a;
5 char c;
6 do
7 {
8 scanf("%d",&a);
9 scanf("%c",&c);
10 printf("a=%d c=%c\n",a,c);/*printf("c=%d\n",c);*/
11 }
12 while(c!='N');
13 return 0;
14 }
2 int main(void)
3 {
4 int a;
5 char c;
6 do
7 {
8 scanf("%d",&a);
9 scanf("%c",&c);
10 printf("a=%d c=%c\n",a,c);/*printf("c=%d\n",c);*/
11 }
12 while(c!='N');
13 return 0;
14 }
scanf("%c",&c);这句不能正常接收字符,什么原因呢?我们用printf("c=%d\n",c);将C用int表示出来,启用printf("c=%d\n",c);这一句,看看scanf()函数赋给C到底是什么,结果是c=10 ,ASCII值为10是什么?换行即\n.对了,我们每击打一下"Enter"键,向键盘缓冲区发去一个“回车”(\r),一个“换行"(\n),在这里\r被scanf()函数处理掉了(姑且这么认为吧^_^),而\n被scanf()函数“错误”地赋给了c.解决办法:可以在两个scanf()函数之后加个fflush(stdin);,还有加getch() , getchar()也可以,但是要视具体scanf()语句加那个,自己去摸索吧。但是加fflush(stdin);不管什么情况都可行。
二、如何处理scanf()函数误输入造成程序死锁或出错?
1 #include<stdio.h>
2 int main(void)
3 {
4 inta,b,c;/*计算a+b*/
5 scanf("%d,%d",&a,&b);
6 c=a+b;
7 printf("%d+%d=%d",a,b,c);
8 return 0;
9 }
2 int main(void)
3 {
4 inta,b,c;/*计算a+b*/
5 scanf("%d,%d",&a,&b);
6 c=a+b;
7 printf("%d+%d=%d",a,b,c);
8 return 0;
9 }
如上程序,如果正确输入a,b的值,那么没什么问题,但是,你不能保证使用者每一次都能正确输入,一旦输入了错误的类型,你的程序不是死锁,就是得到一个错误的结果,呵呵,这可能所有人都遇到过的问题吧?解决方法:scanf()函数执行成功时的返回值是成功读取的变量数,也就是说,你这个scanf()函数有几个变量,如果scanf()函数全部正常读取,它就返回几。但这里还要注意另一个问题,如果输入了非法数据,键盘缓冲区就可能还个有残余信息问题。正确的例程:
1 #include <stdio.h>
2 int main(void)
3 {
4 const int Secret_code = 13;
5 int entered_code;
6 do
7 {
8 printf("请输入密码:");
9 while((scanf("%d",&entered_code))!=1)
10 scanf("%*[^\n]");
11 }
12 while(entered_code!=Secret_code);
13 printf("登录成功!\n");
14 return 0;
2 int main(void)
3 {
4 const int Secret_code = 13;
5 int entered_code;
6 do
7 {
8 printf("请输入密码:");
9 while((scanf("%d",&entered_code))!=1)
10 scanf("%*[^\n]");
11 }
12 while(entered_code!=Secret_code);
13 printf("登录成功!\n");
14 return 0;
===================================