#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
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("放弃确认\n");
return 0;
}
}
这是一个实验性的代码,没有什么实际的意义,但问题是:
在我们输入“密码”的时候,例如:123456
程序就会自动生成“放弃确认”,跳过了中间“(Y/N)”的确定。
其原因就是当我们输入“123456”后敲击的回车键,在缓存区就会留下
“123456\n”,scanf将“123456”存入password缓存区内就是剩下一个“\n”
之后getchar()会将“\n”赋给ret,就不会在让你手动舒服Y/N
if判断中“\n”不等于‘Y’,就自然而然输出“放弃确认”。
起初一个比较容易的解决办法就是在scanf语句后再加入一个“getchar();”
就可以帮我们把“\n”读走,也就不影响之后手动输入“Y/N”进行判断了
但这个方法有个缺陷,例如密码输入:123456 asd
但scanf只会读取空格前的字符串,getchar()这次把空格读走了
但后面仍然存在“asd\n”,所以最后依旧会直接输出“放弃确认”。
目前本人能力内解决办法就是通过以下这个循环
while ((ch = getchar()) != '\n')
{
;
}
前提是记得声明 ch这个变量 int ch = 0;
循环内将“ asd\n”等字符逐一确认,直到“\n”后循环结束。
最终代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int ret = 0;
int ch = 0;
char password[20] = { 0 };
printf("请输入密码:");
scanf("%s", password);
while ((ch = getchar()) != '\n')
{
;
}
printf("请确认(Y/N):");
ret = getchar();
if (ret == 'Y')
{
printf("确认成功\n");
}
else
{
printf("放弃确认\n");
}
return 0;
}