多组输入的实现及操作细节

前言

由于在做oj题中遇到了需要多组输入的问题,第一次看到的时候一脸懵,抓耳挠腮,冥思苦想,就是想不出来思路,后续翻了翻博客,请教高人,终于是吧多组输入搞定了,今天,给大家分享一下多组输入的实现及操作细节吧!



一.多组输入的含义

在编程时,经常会遇到这种情况,程序需要一次性输入多个数据,进行多次跑代码,但是,当我们敲下回车的时候,程序已经开始执行,执行完毕后,想要再次执行程序,就要重新打开程序,这样会非常麻烦,所以就引入了多组输入来解决这一问题。

多组输入就是在你输入数据是,可以多次输入数据,这几组数据分别执行并输出各组的结果,而不是一组一组的执行,直到上一组执行完毕才能重新打开程序执行下一组,可以大大提高效率

二.多组输入的实现

  • 想要实现多组输入,首先要了解scanf的返回类型

1.scanf的返回类型

a.返回正整数。

当正常输入时,会返回扫描的字符的个数

int main()
{
int i=0;
int k=0;
printf("%d\n",scanf("%d %d",&i,&k));
return 0;
}

在这里插入图片描述
在这里插入图片描述
这里输入了2个整数,返回类型为2。

b.返回0

当扫描到的类型与占位符不符合的情况,就会返回0·

int main()
{
int i=0;
int k=0;
printf("%d\n",scanf("%d %d",&i,&k));
return 0;
}

还是这个代码
跑起来看看!
在这里插入图片描述
因为我们的代码中的占位符是%d,只能读取int类型,可是输入的a是char类型,因此就会返回0.

c.返回EOF

  • EOF全称是end of file
  • 它是在stdio.h里面定义的常量,通常值为-1,表示输入流结束。

2.多组输入的实现办法

这里先讲述两种常见方法

a.EOF法(这里有一些细节)

因为EOF表示输入流已经结束,因此可以使用scanf的返回值是否为EOF来判断是否退出循环,达到多组输入的目的。

在这里插入图片描述
在这里插入图片描述
这是一个求三个数的和的代码,可以实现多组输入。
在这里插入图片描述

代码执行效果如上图

可见,成功实现了多组输入。
不知道有没有细心的小伙伴,看见了最后结束的时候,使用了^z符号
这个就是退出的用法

  • 注意:在控制台中,计算机并不知道什么时候到达了EOF,因此就需要手动输入组合键Ctrl+z,接着按下回车就可以结束循环了
  • 这里为什么使用了三次^z呢?
  • 答案在下文

b.正整数法(这里也有一些细节)

通过利用scanf的另外两种返回值为正整数和0,可以写出另一种程序
在这里插入图片描述

还是以上述求三数之和为例

这里将EOF改成了正整数3
运行起来看看效果
在这里插入图片描述
前面正常运算,当出现异常字符a的时候,scanf就会返回0,从而跳出循环

三.操作细节

细节1:

  • EOF法:为什么会输入三次^z呢?
    在这里插入图片描述
    这里有两个空格,空格表示会忽略后边的所有空白字符(包括空格(‘ ’)、换页(‘\f’)、换行(‘\n’)、回车(‘\r’)、水平制表符(‘\t’)、垂直制表符(‘\v’)),直到遇到有效字符,那么这里前两个回车就会被忽略,直到遇到第三个回车,才会被读取。

细节2:

  • 此外,EOF法还有一个细节需要注意
    在使用EOF法的时候,不能通过输入字母等方式来退出循环,否则会进入死循环。
    看一下输入字母的运行效果
    在这里插入图片描述
    陷入了死循环
  • 这是为什么呢?
  • 键盘输入的东西,先在一个叫做缓冲区的地方按输入顺序这么储存,然后scanf从缓冲区读取数据,scnaf在遇到类型与其不匹配的数据的时候,会不读走这个数据,这个数据仍留在缓冲区中,然后去返回它的返回值,在类型不匹配是,返回值是0,而EOF的值是-1,所以循环继续,下一次去读取,仍然类型不匹配,于是陷入死循环。

细节3:

  • 正整数法
  • 正整数法在使用时,存在一定的局限性。
  • 当scanf读取到多余数量的值时,会按照顺序读取,就比如,需要读取三个,但是却输入了4个,那么这一次中,scanf只会读取前三个,第四个会在下一次循环中被当做第一个读取。

ok,这一次的分享大致就是这些内容了,明天继续更新!!!

** QAQ点个关注吧QAQ**

  • 20
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值