问题引出
我们先来看看一段代码
int main{
int ret = 0;
char password[20] = { 0 };
printf("请输入密码:>");
scanf("%s", password);
printf("请确定(Y/N):>");
ret = getchar();
if (ret == 'Y') {
printf("确认成功\n");
}
else {
printf("放弃确认");
}
}
判断以上代码会出现什么问题?
没错,当你输入密码后就会出现以下问题。
系统会直接跳到else{}语句中去.
那么这是为什么呢?
这里就要说说scanf的缓冲区了。
缓冲区
- 缓冲区又被称为缓存,是内存空间的一部分,也就是说在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分存储空间就叫做缓冲区。
c语言中在读取键盘数据时,需要按回车键才能完成该行数据的输入确认。但是 scanf()函数不会读取回车键,也就是说当我们输入123456,然后回车,scanf只读到了回车键(\n)以前的内容,回车键会留在输入缓存区中。
因此,在下一个读“字符”操作函数getchar()运行时,会读到这个字符。这样就会出现以上问题,那么我们怎么去解决呢
解决办法
1.可以用fflush(stdin)命令强行刷新输入缓存。
printf("请确定(Y/N):>");
fflush(stdin);
ret = getchar();
2.可以用getchar()来吃掉前面的回车确认。注意:getchar()一次只能读取一个字符。
printf("请确定(Y/N):>");
getchar();
ret = getchar();
3.在scanf()书写上做文章,如:读一个数据,以回车确认,则输写成如下格式。
printf("请输入密码:>");
scanf("%s%*c", password);//%*c表示读取任意一个字符,但是不会赋值给任意变量
printf("请确定(Y/N):>");
ret = getchar();