1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > getchar函数与其在缓存区的使用(详解易懂)---读取多组值:scanf返回值的理解使用

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

时间:2019-09-18 05:18:49

相关推荐

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

文章目录

前言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返回值的使用,如果对你有一点帮助给个(👍)赞鼓励一下吧!!

感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。