接着上次继续学习
当我们想要输入一个密码,并且进行确认
我们使用这样的代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.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;
}
当我们输入一个密码之后,还没有输入N/Y就显示确认失败了
为什么会发生这样的事
getchar,scanf,输入函数 缓冲区 键盘
当我们输入密码之后,我们还按了\n,这个\ngetchar拿走了,所以导致ch!=Y,导致确认失败
我们该如何确认密码呢
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
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;
}
在中间加一个getchar处理\n
但是日常中我们的密码没有这么简单
假如我们输入23432 342结果又会失败
因为scanf拿走了23432,getchar只能拿走一个字符,缓冲区里面还有42和\n导致确认失败
如果我们想要成功运行,可以使用while循环
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char password[20] = { 0 };
printf("请输入密码:");
scanf("%s", password);
printf("请确认密码(Y/N)");
int tem = 0;
while ((tem=getchar()) !='\n')
{
;
}
int ch = getchar();
if (ch == 'Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
return 0;
}
读取一个字符放在tem中,如果!=‘\n’,如果\n!=\为假,跳出循环
为什么getchar用int定义,因为getchar读取的是字符,字符用ASCII储存,是整型,还有一个解释是getchar返回eof是-1,是一个整型
我们再来看一下这个代码
#include <stdio.h>
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
{
if (ch < '0' || ch>'9')
continue;
else
putchar(ch);
}
return 0;
}
再来看一下ASCII码表
小于字符0大于字符9的都是非数字字符,就会continue,不打印,如果给数字字符就会打印
比如给123打印出来就是123
给ad就不会打印