getchar函数与其在缓存区的使用(详解易懂)---读取多组值:scanf返回值的理解使用


✨✨✨学习的道路很枯燥,希望我们能并肩走下来!

编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得枯燥乏味,像对待任务似的应付它。但你如果深入探索,就会发现其中的奇妙,了解许多所不知道的原理。知识的力量让你沉醉,甘愿深陷其中并发现宝藏。



前言

本篇是在题中如何使用EOF作为判断条件,进行多组输入的,在习题中体会getchar的使用,如有错误,请在评论区指正,让我们共同进步!


本文开始

1.scanf返回值的应用

1.判断一个人是否为天才?

题目要求:智商大于140称为天才
输入描述:
多组输入,每行输入包括一个整数表示的智商。
输出描述:
针对每行输入,输出“Genius”。

示例1:

输入:160
输出:Genius

是不是认为这道题很简单,你有可能会这样输入
让我们看一下!

#include<stdio.h>
int main()
{
	int iq = 0;
	//输入一个智商
	scanf("%d", &iq);
	if (iq >= 140)
	{
		printf("Genius\n");
	}
	return 0;
}

上述代码是错误的,只能读取一组数据,如果是多组数据我们就错误了,你有没有进坑呢?这里我们要注意题目要求要看清 它是 多组输入,上述代码只完成了输入一次就判断完成了,但是你不知道会输入几次,这就导致了错误.
如何改正呢?这里用到了scanf的返回值,让我们来学习一下吧!

1.1scanf返回值的认识

在这里插入图片描述

这里可以看到 scanf 的返回值是一个整型,那它到底返回多少?我们来看一下!

在这里插入图片描述

这里的意思是:
如果读取一个成功,返回整数1;如果读取两个,就返回整数2(例如: scanf(“%d %d”,&n1,&n2) );读取几个就返回几.
如果读取失败,就返回EOF,根据定义EOF的值为-1

知道了scanf的返回值,我们怎么操作呢?
看我们的题目,既然可能多组输入,就用到了循环,让我们来看一段代码吧!

#include<stdio.h>
int main()
{
	int iq = 0;
	//输入一个智商
	//写法一:判断读取正常
//	while (scanf("%d", &iq)==1)
//	{
//		if (iq >= 140)
//		{
//			printf("Genius\n");
//		}
//	}

	//写法二判断读取不正常的情况
	while (scanf("%d", &iq) !=EOF)
	{
		if (iq >= 140)
		{
			printf("Genius\n");
		}
	}
	return 0;
}

这就是scanf返回值不知道输入几组数据时,可以利用返回值来操作,你学会了吗?让我们再来看一道吧!!!

2.判断两个数的大小关系

题目:

注意题目要求哦!

示例1:

输入:1 1
输出:1=1

示例2:

输入: 1 0
输出:1>0

示例3:

输入:0 1
输出:0<1

这道题与第一题类似,但是他们scanf读取的值不一样,这道题读取的是两个值,一定注意!!!

#include<stdio.h>
int main()
{
	int n1 = 0;
	int n2 = 0;
	
	while (scanf("%d %d", &n1, &n2) == 2)
	{
		if (n1 > n2)
		{
			printf("%d>%d\n", n1 > n2);
		}
		else if (n1 < n2)
		{
			printf("%d<%d\n", n1 < n2);
		}
		else
		{
			printf("%d=%d\n", n1 = n2);
		}
	}


//while (scanf("%d %d", &n1, &n2) !=EOF)
	//{
	//	if (n1 > n2)
	//	{
	//		printf("%d>%d\n", n1 > n2);
	//	}
	//	else if (n1 < n2)
	//	{
	//		printf("%d<%d\n", n1 < n2);
	//	}
	//	else
	//	{
	//		printf("%d=%d\n", n1 = n2);
	//	}
	//}
	return 0;
}

2.getchar在缓存区的使用

2.1了解getchar,putchar

什么是getchar呢?就是得到一个字符,并且getchar函数没有参数.

在这里插入图片描述

如果需要连续读取字符这就需要getchar的返回值了,那它的返回值是什么呢?我们来看一下!

  • 当getchar读取文件末尾时,会返回EOF(-1)
    EOF => end of file(文件结束标志)
  • 当getcahr读取错误时,返回EOF(-1)

在这里插入图片描述

而putchar 不一样,它 接收一个整型

在这里插入图片描述

2.2getchar在缓存区的使用

我们通过代码来看一下它们的使用吧!

#include<stdio.h>
int main()
{
	//为什么能用整型接收字符呢?
	//字符在内存中是以ASCII值存在的,所以字符属于整型
	//int ch = getchar();
	//putchar(ch);

	int ch = 0;
	while ((ch=getchar() )!= EOF)
	{
		putchar(ch);
	}

	return 0;
}

在这里插入图片描述

通过代码我们发现,getchar函数也也能够读取回车,当输入一个字符时,回车输出结果时,getchar也会把回车读取,也就是读取了两个值,字符+回车.

ctrl+z停止输入操作

那这样的getchar有什么作用?我们通过一段代码来思考一下!

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

在这里插入图片描述

错误的逻辑(不清getchar,scanf在楚缓存区的使用)
我们以为的逻辑是,我输入一串密码,确认输入的是否正确,再输入Y/N;但是结果却不是这样,我还没来的及确认密码(输入Y/N),直接说确认失败.

这是那 出现了问题 呢?
我们先通过scanf函数了解一下 scanf函数读取字符不是直接从键盘输入得到的,而是先从输入缓冲区寻找有无字符,如果没有就等待键盘输入字符,有字符后再取出;getchar函数与scanf函数使用原理一样,都需要从缓冲区中取出值

在这里插入图片描述

错误原因:
当输入abcdef\n时,scanf函数会拿走字符串abcdef,而缓冲区中还存在\n,这时,getchar会取走\n导致ch!=Y,从而判断为假确认失败;

改进代码2.0

解决/n问题:
为了防止getchar读取\n,我们在scanf函数后面在写上一个getchar提前读取走\n,让缓冲区中为空,此时等待键盘输入Y/N从而确认密码.

#include<stdio.h>
int main()
{
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);
	//清空缓冲区中\n
	getchar();
	printf("请确认密码(Y/N):");
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("输入正确\n");
	}
	else
	{
		printf("确认失败\n");
	}
	return 0;
}

虽然解决了\n的问题,但不要高兴的太早 代码还存在问题因为scanf函数读取到空格就停止了,如果输入的密码中字符串+空格+字符串,就会出现确认失败的情况.
错误如下:

在这里插入图片描述

这里输入完之后scanf函数只读取了abcdef,缓冲区中还存在(下划线暂替空格)_haha,新的问题出现了,小伙伴们思考一下,如何解决呢?

通过画图,构思一下吧!!!

在这里插入图片描述
abcdef已经被scanf取走在这里插入图片描述

改进代码3.0

解决空格与多余字符问题

这里我们可以使用循环来解决,我们都知道输入字符串结尾为\n,我们可以 利用循环结合getchar清除掉缓存区里的值 ,使得可输入Y/N来判断是否输入正确.

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

在这里插入图片描述

总结语

✨✨✨各位读友,本篇分享到内容是否更好的让你理解了getchar在缓存区中的使用 ,从新认识了scanf返回值的使用,如果对你有一点帮助给个(👍)赞鼓励一下吧!!
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值