原因:
前面的scanf语句匹配所需格式的字符后会残留回车键字符会被后面的scanf获取造成不被期待的输入
三种scanf吸收垃圾字符的过程:
1) 利用scanf严格控制格式的特点
在2个格式中间加上空格
1 #include <string.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4
5 int main(int argc, const char *argv[])
6 {
7 char c1, c2;
8 printf("please input c1, c2\n");
9 scanf("%c %c", &c1, &c2);//%c之间的空格吸收了前面输入的回车建
10 printf("c1=%c\n", c1);
11 printf("c2=%c\n", c2);
12 return 0;
13 }
2) 利用%* 抑制字符吸收,
但是抑制字符一定要吃掉一个字符, 有可能吸收有效字符, 不建议使用
1 #include <string.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4
5 int main(int argc, const char *argv[])
6 {
7 char c1, c2;
8 printf("please input c1, c2\n");
9 scanf("%c%*c%c", &c1, &c2);
10 printf("c1=%c\n", c1);
11 printf("c2=%c\n", c2);
12 return 0;
13 }
3) getchar() 吸收垃圾字符
1 #include <string.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4
5 int main(int argc, const char *argv[])
6 {
7 char c1, c2;
8 printf("please input c1, c2\n");
9 scanf("%c", &c1);
10 getchar(); //getchar 吸收上面scanf留下的垃圾字符
11 scanf("%c", &c2);
12 printf("c1=%c\n", c1);
13 printf("c2=%c\n", c2);
14 return 0;
15 }