文章目录
前言1.scanf返回值的应用1.判断一个人是否为天才?1.1==scanf返回值的认识==2.判断两个数的大小关系2.getchar在缓存区的使用2.1了解getchar,putchar2.2getchar在缓存区的使用==改进代码2.0====改进代码3.0==总结语✨✨✨学习的道路很枯燥,希望我们能并肩走下来!
编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得枯燥乏味,像对待任务似的应付它。但你如果深入探索,就会发现其中的奇妙,了解许多所不知道的原理。知识的力量让你沉醉,甘愿深陷其中并发现宝藏。
前言
本篇是在题中如何使用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);//清空缓冲区中\ngetchar();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返回值的使用,如果对你有一点帮助给个(👍)赞鼓励一下吧!!
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!