使用getchar()函数清理缓冲区

小白编写,大佬勿喷,欢迎指正.

getchar()函数

在缓冲区内获取一个字符

获取失败将会返回EOF(EOF是一个字符常量 为-1)

头文件是<stdio.h>

当我们写了这样一段代码时

#include <stdio.h>
int main()
{
	char ch = 0;
	char arr[20] = { 0 };
	printf("请输入密码:");
	scanf("%s", arr);//输入abcdef
	printf("请确认密码(Y/N)");
	ch = getchar();
	printf("\n");
	if (ch == 'Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}
	return 0;
}

运行结果是

 图中可以看到,我们还并没有输入确认密码(Y/N) 就直接输出了确认失败.

出现这种情况的原因

我们看到在键盘输入字符 abcdef 加回车 在内存缓冲区中实际存入的字符是 "abcdef\n"

scanf只能拿走abcdef 最后缓冲区中剩下一个字符'\n' 当代码运行到getchar时 直接读取了'\n' 所以直接打印了 确认失败

那么如何解决

既然getchar可以获取缓冲区的字符,我们不妨在 ch = getchar(); 之前再写一个getchar函数,让这个getchar把内存中的'\n' 拿走,这样当运行到 ch = getchar()时缓冲区内没有数据,程序就会停下来等待我们输入.

代码如下

#include <stdio.h>
int main()
{
	char ch = 0;
	char arr[20] = { 0 };
	printf("请输入密码:");
	scanf("%s", arr);//输入abcdef
	printf("请确认密码(Y/N):");
    getchar();
	ch = getchar();
	printf("\n");
	if (ch == 'Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}
	return 0;
}

运行结果

 不要以为这样就解决了问题.

当有人这样输入呢?

 这次程序又没有停下来,直接打印了确认失败.为什么会这样呢.

原因是 使用%s输入 遇到空格就停止了,所以当scanf拿走了abcdef,缓冲区中还剩 空格123\n .

那么如何解决这种情况呢

第一种方法我们可以用gets()函数这里就不展开了

第二种方法是循环使用getchar()函数把缓冲区的数据拿空,到了确认密码的时候程序就会停下来.

代码如下

#include <stdio.h>
int main()
{
	char ch = 0;
	char arr[20] = { 0 };
	printf("请输入密码:");
	scanf("%s", arr);//输入abcdef 123
	printf("请确认密码(Y/N):");
	while (getchar() != '\n') //当getchar拿到了'\n' 说明缓冲区已经空了
	{
		;
	}
	ch = getchar();
	if (ch == 'Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}
	return 0;
}

运行结果如图

 这样就解决了问题.

  • 10
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值