好久没更了,我没弃,只是去了趟国外,而且还得了肠胃炎,躺了一周多
首先打印如下代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
char password[20] = { 0 };
printf("请输入密码:");
scanf("%s", password);
printf("请确认密码(Y/N):");
int ch = getchar();
if (ch =='Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
return 0;
}
我们想要一个执行输入密码然后弹出确认密码,根据我们输入YorN来反馈确认成功或者确认失败。但是代码执行如下:
可见,输入密码123后直接打印了确认失败。
原因解释:其实getchar和scanf输入函数会从缓冲区获取信息,如果没有则从键盘获取。所以我们首先出发scanf后输入123然后回车后,回车触发将输入内容放置了缓冲区,此时放入的为123\n,然后scanf拿取123放入password变量。缓冲区还剩一个\n,然后执行getchar,理论getchar应该等待我们输入YorN,但是因为缓冲区存在内容,所以直接拿取\n放入ch。ch不等于Y执行了else所以直接输出确认失败。
所以,要想修改这一代码,需要将缓冲区的\n清除。
int main()
{
char password[20] = { 0 };
printf("请输入密码:");
scanf("%s", password);
printf("请确认密码(Y/N):");
//清理缓冲区
getchar();//处理\n扔掉
int ch = getchar();
if (ch =='Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
return 0;
}
得到如下:
但是有时候情况复杂,比如我输入123 abc还是直接弹出失败!
原因解释:我输入123 abc后,缓冲区是123 abc\n,scanf一次拿走空格前的内容123,然后getchar拿走abc,所以还剩下\n。所以想要万无一失,需要一直getchar拿走,直到清除一切。代码如下:
int main()
{
char password[20] = { 0 };
printf("请输入密码:");
scanf("%s", password);
printf("请确认密码(Y/N):");
//清理缓冲区
int tmp = 0;
while ((tmp = getchar()) != '\n')
{
;
}
int ch = getchar();
if (ch =='Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
return 0;
}
通过加入while ((tmp = getchar()) != '\n')
{
;
}
如果getchar的字符不等于\n就一直循环执行getchar,直到get到最后一个,将缓存区提取完毕
这样就解决了,代码运行如下: