linux系统中C语言中的清空scanf输入缓冲区
程序员文章站
2022-03-16 17:31:51
...
为什么会单独将字符串的输入拿出来讲,因为字符串和其他的输入来说有一点不同,在C语言中,从键盘输入有多个函数
- scanf:和 printf()类似,scanf()可以输入多种类型的数据。
- getchar()、getche()、getch():这三个函数用于输入单个字符。
- gets():获取一行数据,作为字符串处理
scanf 函数
1 #include <stdio.h>
2 #include <string.h>
3 void sum();
4 void sub();
5
6 void sum()
7 {
8 int sum,a,b,c;
9 printf("请输入第一个数\r\n");
10 scanf("%d",&a);
11 printf("请输入第二个数\r\n");
12 scanf("%d",&b);
13 sum=a+b;
14 printf("相加的值为%d\r\n",sum);
c=getchar();
15 }
16 void sub()
17 {
18 char arr[]={'z','h','a','n','g'};
19 char arr1[]="zhang";
20 long la=sizeof(arr);
21 long la1=sizeof(arr1);
22 printf("%ld,%ld\r\n",la,la1);
23 }
24
25 int main()
26 {
27 char choose;
28 while(1)
29 {
30 printf("*************************************************\r\n");
31 printf(" 欢迎来到个性化计算器\r\n");
32 printf(" 请根据提示选择相应的操作\r\n");
33 printf(" 1:加法 2:减法 3:乘法 4:除法 5:取模\r\n");
34 printf(" 请输入您的计算法则\r\n");
35 printf("*************************************************\r\n");
36
37 scanf("%c",&choose);
38 switch(choose)
39 {
40 case '1':
41 printf("加法运算\r\n");
42 sum();
43 break;
44 case '2':
45 printf("减法运算\r\n");
46 sub();
47 break;
48 case '3':
49 printf("乘法运算\r\n");
50 break;
51 case '4':
52 printf("除法运算\r\n");
53 break;
54 case '5':
55 printf("取模运算\r\n");
56 break;
57 case '0':
58 printf("程序将在3秒后退出\r\n");
59 sleep(3);
60 return 0;
61 default:
62 printf("输入数据不合法,请重新输入\r\n");
63 break;
64 }
65 }
66 return 0;
67 }
结果:
这里问题就在于我想要的是输入1之后,进行加法运算,然后回到选择界面,可这里在进行完之后在我们意料之外输出default的语句。这就是因为输入缓冲区的问题。因为我们使用%c输入,识别到的是两个字符‘1’,‘\n’,所以在我们进行第一次case之后会自动再进行一次default运算。
解决的方法就是:
1. 将char类型改为int;
2. 清空缓冲区,在linux下fflush()不能清空缓冲区,此时,我们选择回收字符就可以解决这个问题;有时候我们可以结合while进行使用;
修改后的结果:
上一篇: Centos 配置静态 IP