最全【C】getchar函数与其在缓冲区的应用_你说是接收缓冲区字符用的,C C++开发基础自学

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!


getchar使用实例:只打印数字字符,跳过其他字符的,代码如下。

#include<stdio.h>
int main()
{
	int ch = 0;
	while ((ch = getchar())!=EOF)
	{
	
		if (ch<'0'||ch>'9')
		{
			continue;
		}
		putchar(ch);
		printf("\n");
	}

	return 0;
}

💻.2 getchar清理缓存区

看这样一个代码,输入一个密码,然后进行确认密码。

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

![在这里插入图片描述](https://img-blog.csdnimg.cn/21183cd73a604b72a77819ad8ddbf55e.png
看这里的运行结果,还没有输入Y/N进行确认,便已经输出了结果了
这里是因为我们在输入abcdef后,它只是在缓冲区等待进行读取,当我们在键盘上敲入回车后,在缓冲区放入了一个\n,scanf才会进行读取,要注意的是scanf在遇到空白符(如换行、空格等)会结束读取,所以scanf并不会去读取\n,getchar会将缓冲区中的\n读走进行判断结束了程序。
在这里插入图片描述
这里在scanf读走字符串后我们需要解决掉这个\n 才可以正常进行确认密码,也就是需要清理缓冲区


如果只是要清理上面的问题,我们只需要把缓冲区的\n清理掉即可,做法如下:

#include<stdio.h>
int main()
{
	int password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);

	getchar();//清理\n

	printf("请确认密码(Y/N):>");
	int ret = getchar();
	if (ret == 'Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}
	return 0;
}

在这里插入图片描述
这里在scanf后加了一个getchar,当scanf读取结束后,getchar接着就会把缓冲区的\n清理掉;但这个方法只是可以临时解决问题,存在很大的弊端,看下面这个运行结果
在这里插入图片描述
当输入的密码中包含空格,因为scanf遇到空白符会结束读取;而这时scanf后的getchar只能清理一个字符,后面的qwer\n就无法被清理而导致无法正常进行密码的确认,所以说这种方法有时候无法完全清理缓冲区,原因是这里的getcher只能实现一次清理,而如果我们可以实现多次清理就可以解决这个弊端。
下面是优化后的清理缓存区的代码。
将scanf后的getchar换成
while ((ch = getchar()) != ‘\n’)
{
;
}
这条循环语句会让getchar逐个清理缓存区的字符,直到将最后的\n清理掉循环结束.

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

在这里插入图片描述

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值