scanf 字符输入问题(垃圾字符的处理)

使用 scanf 进行多个数据输入时,不管是一个一个地输入(用空格分隔),还是多个数据一次性输入,这两种输入方法的结果都是一样的。
原因是从键盘输入的数据都会被依次存入缓冲区,不管是数字还是字符都会被当成数据存进去。
但只有按回车,scanf 才会进去取数据,所取数据的个数取决于 scanf 中“输入参数”的个数。
 %d 在接收缓冲区中的数据时,空格、回车、Tab 键都只是分隔符,不会被 scanf 当成数据取用。%d 遇到它们就跳过,取下一个数
据。但是如果是 %c,那么空格、回车、Tab 键都会被当成数据给 scanf 取用。当使用%c 进行数据获取时,往往会出现问题。
解决方法——给%c赋值前清空输入缓冲区
1.fflush(stdin)
fflush是包含在文件 stdio.h 中的函数。stdin 是“标准输入”的意思。std 即 standard(标准),in 即 input(输入),合起来就是标准输入。
功能:清空输入缓冲区
# include <stdio.h>
# include <stdlib.h>
int main(void)
{
int a, c;
char b;
printf("input a");
scanf("%d",&a);
fflush(stdin);//将前一个 scanf 输入的缓冲区全部清空
printf("\ninput b,c\n");
scanf("%c%d",&b, &c);//此时缓冲区就是回车后录入的新数据 5 6 回车
//此时%c 就接收 5 进入变量 b,%d 遇到空格跳过,将数据 6 进入 c
//缓冲区只剩回车,不处理。
printf("a = %d, b = %c, c = %d\n", a, b, c);
system("pause");
return 0;
}
2.while (getchar() != '\n');
不管用户输入多少个没用的字符,最后都得按回车,而且只能按一次。只要他按回车那么回车之前的字符就都会被 getchar() 取出来。
只要 getchar() 取出来的不是回车 ('\n') 那么就会一直取,直到将用户输入的垃圾字符全部取完为止。
# include <stdio.h>
# include <stdlib.h>
int main(void)
{
int a, c;
char b;
printf("input a");
scanf("%d",&a);
//将前一个 scanf 输入的缓冲区通过循环全部清空
while(getchar()!=’\n’)//表示只要字符不是回车就继续吃缓冲区字符
{
;//空语句
}
printf("\ninput b,c\n");
scanf("%c%d",&b, &c);//此时缓冲区就是回车后录入的新数据 5 6 回车
//此时%c 就接收 5 进入变量 b,%d 遇到空格跳过,将数据 6 进入 c
//缓冲区只剩回车,不处理。
printf("a = %d, b = %c, c = %d\n", a, b, c);
system("pause");
return 0;
}
 
posted @ 2020-06-10 00:26  泰勒斯儿童营养牙膏  阅读(503)  评论(0编辑  收藏  举报