问题一.从键盘输入值时, 回车后出现几行沾在一起、多行合并在一起的, 从而导致不能正确读取的问题
代码:
#include <stdio.h>
main()
{
char a, b, c;
printf("输入a: ");
scanf("%c", &a);
printf("输入b: ");
scanf("%c", &b);
printf("输入c: ");
scanf("%c", &c);
}
结果:
原因:
用户从键盘输入的字符(回车,也是一个字符),都会先进入缓冲区,程序按占位符逐个读取数据,字符在被读取后,才会消失,否则会一直存在于缓冲区,直至被读取。
所以在输入 4 后, 用户回车(\n)以确定输入后.
此时, 缓冲区有: ‘4’ ‘\n’所以scanf(“%c”, &a);读取了‘4’, 把4给了a,
由于缓冲区还有‘\n’, 所以scanf(“%c”, &b); 自动从缓冲区读取了‘\n’, 并把‘\n’给了b
由于自动从缓冲区读取(不用按回车键), 便没有换行(几行沾在一起、合并在一起), b的数据也读取不成功
解决:
- 在第2,3,4…条读取字符的scanf()的语句前加getchar();
#include <stdio.h>
main()
{
char a, b, c;
printf("输入a: ");
scanf("%c", &a);
getchar(); // 添加getchar();把回车符读取
printf("输入b: ");
scanf(" %c", &b);
getchar(); // 添加getchar();把回车符读取
printf("输入c: ");
scanf(" %c", &c);
}
- 在scanf中的%c前加空格 冲走‘\n’
#include <stdio.h>
main()
{
char a, b, c;
printf("输入a: ");
scanf("%c", &a);
printf("输入b: ");
scanf(" %d", &b); // 用空格冲走'\n'
printf("输入c: ");
scanf(" %c", &c); // 用空格冲走'\n'
}
注意:
需要注意的是,是由于按了回车导致,并且下一条scanf语句(读取的第一个字符是%c)能读取‘\n’,才会导致行合并,无法正确读取的问题
而%d会自动冲掉‘\n’, 所以不需要在%d前加冲掉‘\n’的操作
示例:
#include <stdio.h>
main()
{
char a, b, c;
printf("输入a: ");
scanf("%c", &a);
printf("输入b: ");
scanf("%d", &b);
printf("输入c: ");
scanf("%c", &c);
}
scanf(“%c”, &a); 成功读取了‘4’给a
scanf(“%d”, &b); 不为%c,无法自动读取%c,不会出现行合并的的问题
成功读取了5给bscanf(“%c”, &c); 由于缓冲区有‘\n’(且没有加冲掉‘\n’的操作),就自动读取了‘\n’
PS: char 也可以看作为数值, 所以scanf(“%d”, &b);是可以的