scanf与getchar是同类型的函数,但是在接受时并不会直接接受来自键盘的传入的数据,在键盘与这两个函数的传递之间有一块缓冲区,好比古代两地运送物资之间的驿站。
当我们输入一串字符的时候,键盘会先将输入的内容放到缓冲区中,然后我们按下回车后,函数才会再读取数据。现在让我们看一个例子。
#include<stdio.h>
# define _CRT_SECURE_NO_WARNINGS
int main()
{
//假设验证码是一个字符串
char password[20] = { 0 };
scanf("%s", password);
printf("请确认密码>:Y/N");
int ret = getchar();
if ('Y' == ret)
{
printf("yes");
}
else
{
printf("no");
}
return 0;
}
大家如果尝试将此代码自己运行后就会发现,当我们输入一串字符比如abcd,就会直接弹出no,为什么呢,是因为在缓冲区,我们在输入abcd后点击了回车才会输入给函数,而此时缓冲区就会多了一个"\n"字符 ,而scanf是不会读取\n的,好比scanf这位加工厂老板不要\n这个原材料,但接下来getchar这位老板来缓冲区进货就拿走了\n,导致ret当中储存的是\n的ASCII码值,自然就不会输出no了。如何解决这个问题呢?那么既然getchar()本身会读取\n,那么我们让另一个getcahr()将这个\n搬运走就好了。
#include<stdio.h>
# define _CRT_SECURE_NO_WARNINGS
int main()
{
//假设验证码是一个字符串
char password[20] = { 0 };
scanf("%s", password);
printf("请确认密码>:Y/N");
getchar();//将\n读走,避免下一个getchar再读取
int ret = getchar();//此时我们再输入字符Y或者是N就可以顺利判断了
if ('Y' == ret)
{
printf("yes");
}
else
{
printf("no");
}
return 0;
}
但是此时也会有一些小麻烦,假如我们输入的字符串是abcd (此处为一个空格)efgh,但是scanf这个大爷实在气傲,它碰到空格就截止接收数据了(暂且不讨论输入的密码中为什么不能有空格,我们只是举一个特例),而getchar()就会接受包括空格后所有的字符,同样会干扰后面判断的进行,所以我们要在判断前加一个循环语句,将包括空格后的所有字符都吸收掉
#include<stdio.h>
# define _CRT_SECURE_NO_WARNINGS
int main()
{
//假设验证码是一个字符串
char password[20] = { 0 };
scanf("%s", password);
int ch= 0 ;
while((ch = getchar())!='\n')
{
;
}
printf("请确认密码>:Y/N");
int ret = getchar();
if ('Y' == ret)
{
printf("yes");
}
else
{
printf("no");
}
return 0;
}
添加了一个循环语句后,我们就可以顺利的将缓冲区中剩下的字符都吸收掉,避免干扰后面判断的正常进行。