c语言使用scanf()函数跳过输入字符型%c的问题
(一)问题
(1)问题代码:
#include<stdio.h>
int main()
{
int x;
char y;
printf("请输入一个整数:");
scanf("%d",&x);
printf("整型x=%d\n",x);
printf("字符型x=%c\n",x);
printf("\n");
printf("请输入一个字符:");
scanf("%c",&y);
printf("整型y=%d\n",y);
printf("字符型y=%c\n",y);
return 0;
}
(2)测试结果:
(二)问题解析
(1)scanf()函数输入字符时的执行原理
1、用户输入的字符,会以ASCII码的形式存储在键盘缓冲区;
2、scanf()函数每执行一次,就从键盘缓冲区读出一个ASCII值;
3、调用scanf()函数时,用户最后输入的回车键也会以换行符’\n’的ASCII码储存在键盘缓冲区;
(2)输入输出流程
1. 图像描述
2.文字描述
<mark>程序详细执行过程</mark>
1、第一个scanf()函数等待用户输入;
2、用户输入49,同时49作为ASCII码值存储在缓冲区;
3、第一个scanf()函数读取整型ASCII值到x,故此刻整型x=49,字符型x=‘1
4、用户敲下回车键,同时回车键(换行符’\n’)转化为ASCII码(10)值存入缓冲区;
5、第二个scanf()函数跳过用户输入,缓冲区已有数据,直接读取缓冲区数据;
6、所以整型y=10,字符型y=’\n’。
(三)解决问题
(1)解决办法
(一)用getchar()来接收多余的回车键
(二)通过添加 fflush(stdin) 或 rewind(stdin) 来清空键盘缓冲区
<mark>注意事项:</mark>
1.在循环语句输入字符类型数据时也要及时接收回车键或者清空键盘缓冲区
2.二者使用意义不同,getchar()是接收缓冲区多余的回车,而fflush(stdin)和rewind(stdin)是清除缓冲区
(2)正确代码
#include<stdio.h>
int main()
{
int x;
char y;
printf("请输入一个整数:");
scanf("%d",&x);
printf("输出:%d\n",x);
printf("请输入一个字符:");
getchar(); // fflush(stdin)、rewind(stdin)
scanf("%c",&y);
printf("输出:%c\n",y);
printf("ASCII码:%d\n",y);
return 0;
}
(3)测试结果
(四)提出问题
如果输入整数或者字符串时,为什么又不读取回车键的ASCII值呢?
>答:scanf()函数中的%d和%c分别限定了输入的数据类型,如果在%d的限定下输入了回车、空格或者Tab,是不会将其转换为ASCII值存入缓冲区,scanf()会继续等待用户输入整数并读取到整型数据后,它才会结束,这也是我们为什么输入多个整数是可以用空格、回车以及Tab等隔开多个整型数据的输入的原因。