#每日落日分享#
今天浅显的学习了'getchar',现在记录下来。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int ch = 0;
char password[20] = { 0 };
printf("请输入密码:>");
scanf("%s", password);
printf("请确认密码(Y/N):>");
ch = getchar();
if (ch == 'Y')
printf("确认成功");
else
printf("放弃确认");
return 0;
}
结果如下:
很显然,跳过了确认密码,并没有达成我想要的目的。
开始寻找问题所在,通过询问,我了解到键盘输入“123456”然后回车会在输入缓冲区形成“123456\n”,经过第一次读取,输入缓冲区只剩下‘\n’,显然‘getchar’获取了‘\n’。
#include<stdio.h>
int main()
{
char x = '\n';
printf("%d\n", x);
return 0;
}
通过编译可知结果为“10”,对照ASCII码值可知为非Y,所以就会打印“放弃确认”。
要想解决这个问题就要把缓冲区的字符全都提取干净,如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int ch = 0;
char password[20] = { 0 };
printf("请输入密码:>");
scanf("%s", password);
getchar();
printf("请确认密码(Y/N)");
ch = getchar();
if (ch == 'Y')
printf("确认成功");
else
printf("放弃确认");
return 0;
}
结果如下:
但此时还有一个问题:
可以看到,一旦加了空格就回到解放前。原因还是因为缓冲区没有清理干净。
#include<stdio.h>
int main()
{
int ch = 0;
ch = getchar();
putchar(ch);
return 0;
}
在这里我键盘输入了多个字符,但最终显示的永远为最前面的一个字符,所以
’getchar‘是一个一个的获取字符的。(推测的,本人完全是小白)
想要确保把缓冲区清理干净的话可以弄个循环:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int ch = 0;
char password[20] = { 0 };
printf("请输入密码:>");
scanf("%s", password);
while (getchar() != '\n')
{
;
}
printf("请确认密码(Y/N)");
ch = getchar();
if (ch == 'Y')
printf("确认成功");
else
printf("放弃确认");
return 0;
}
现在就欧了!