scanf与getchar()的应用小贴士

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;
}

添加了一个循环语句后,我们就可以顺利的将缓冲区中剩下的字符都吸收掉,避免干扰后面判断的正常进行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值