关于scanf函数多组数据输入的一些个人的初步理解

今天做题时遇到一道很有趣的题目,如下:

鉴于做这道题的时候我还没有scanf多组数据的相关知识,于是我进行了一些思考。

第一次解这道题的时候并没有仔细的阅读题目,导致第一次就是简单的将问题理解成scanf一次2个数即可,结果显而易见的错了,经过重新的审题发现了问题的关键:如何一行一行的scanf?

第一反应就是用while循环,因为行数不定,所以第一次修改结果如下 :

之所以写成这样是因为当时我认为while(scanf...)这个条件在所有已知数据都读完后不会为真了,也就是说,我没想到上图里实际输出中后面无限个0=0的情况。后来我又尝试了一下,发现scanf在读完已有数据后会继续把“空白(NULL)”读成0然后这个程序继续进行。

在实在没有办法的情况下,我进行了一些“投机取巧”:

不难看出,在我上图中的程序可以实现除了0和0比大小之外任意两个在定义域之内的数进行比较大小。但问题就是它无法自主进行0=0的运算。

在一些时间的思考以及翻阅c的网站后,我第一次想出了真正的解决办法:

如上图,此时可以说其实我已经简单的接触了一些多项输入的知识但当时我还不知道,这个程序相较于之前的改进在于while中判断了scanf的结果是否为EOF(end of file),这就能够实现判断是否为空行的问题。但是!

但是,这里仿佛有一个bug,就是按照我第一次输入的程序的逻辑,scanf应该是可以把空白(NULL)读成0的,如果是这样我们在看上图的程序就会发现在while这步,当遇到空行时,scanf“好似”应该先把两个NULL读成0,在判断整个scanf的时候的结果“貌似”应该是2而不是EOF。说实话这的问题我现在也没有找到原因,如果以后我知道原因了我会单独写在后续的blog里。这个问题也延续到了下一种答案里。

在我想出这个答案之后,我了解到了多组数据输入的一些相关知识,发现上一种做法是比较麻烦的,用到了一维数组。而直接运用多组数据输入的处理方法则能更简单地回答这道题:

也就是上图所示的程序,这里对scanf的结果进行了是否为2的判断,从而解决了判断空行的问题。但也正如我在上文提到的,这里也涉及到我所说的那个“bug”。目前我只觉得是当我们对scanf函数整体判断其结果时,scanf就不会将数据之后的空白(NULL)读成0再参与运算了。

那么今天的blog就到此结束了,欢迎各位读者大佬进行留言指正。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值