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

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

getchar()函数

在缓冲区内获取一个字符

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

头文件是

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

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

运行结果是

使用getchar()函数清理缓冲区_第1张图片

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

出现这种情况的原因

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

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

那么如何解决

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

代码如下

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

运行结果

使用getchar()函数清理缓冲区_第2张图片

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

当有人这样输入呢?

使用getchar()函数清理缓冲区_第3张图片

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

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

那么如何解决这种情况呢

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

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

代码如下

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

运行结果如图

使用getchar()函数清理缓冲区_第4张图片

 这样就解决了问题.

你可能感兴趣的:(C语言学习,c语言)