为什么有时候当你写了一句scanf(“”),按下一次Enter键,程序并不输出结果?

作者在解决一道程序题时遇到bug,发现当使用scanf时,输入带有空格会导致程序不连续运行。问题在于scanf后多余的空格被识别为额外输入,影响了程序流程。通过理解缓冲区和格式化输入规则,作者解决了这个问题。
摘要由CSDN通过智能技术生成
 我终于明白了!!

 这是今天在写一道很简单的程序题时,偶然发现的一个“bug”:不小心在scanf(“%f %f %f ”)←这个三个%f的后面跟了个空格,导致程序 不能一次输出结果,我就很好奇 到底是哪里出了问题,明明和以前一样写的scanf,但这次我却要多run code一次才输出结果。

#include <stdio.h>
#include <math.h>
int main()
{
    float a,b,c;
    printf("your data is");
    scanf("%f %f %f ",&a,&b,&c);
    if(a+b>c && a+c>b && b+c>a)
    {
        float p=(a+b+c)/2;
        float s=sqrt(p*(p-a)*(p-b)*(p-c));
        printf("area is %.1f",s);
    }
    else printf("no ");
    return 0;

}     

这是我键入三条边的数值之后,按下第一次enter键的结果(左图p1) 

在左图的基础、原界面上,我再按下一次run code(右图p2) 虽然能够出现输出结果,但我还是想知道为什么这样。

然后我带着代码去问了Ai 他告诉我:balabala换行符balabal缓冲区balabal消耗掉换行符(下图)但其实它所给的代码里三个%f的后面依然有空格,我也不知道它在讲啥,反正大概我就明白了和换行符和缓冲区有关吧。

然后我还想到了今天中午刚看到的一篇关于c语言格式化输入的文章

有讲到空格、换行、和缓冲区,感觉讲的很细致!!(放个链接)满心欢喜收藏,以为拿下了,结果晚上就被摆了这一道!

格式化输入的文章icon-default.png?t=N7T8https://blog.csdn.net/xw1680/article/details/134046719然后等我的搭子靠着火眼金睛发现了是这个空格的问题之后,我们左思右想了好一会,到底为什么,然后各自去搜文章,找理解。在我重新看了一遍Ai给的解释后,我发现了一句话:

 于是我主观理解了一下:是不是我在输入三边长,三个值之后,再输入(空格)(随便一个数),就是所谓的额外的输入了呢。然后↓

在我正常输入完 5 12 13后 接着输入了一个1,然后(信心满满)按下enter,它居然真的可以运行了!(此时大脑放起了星际穿越的bgm)(飞速运转一下)(好像get了……)

All in all 在我正常键入了三个值以后,由于手欠多加了一个空格,所以第一次按下enter键相当于接受了那个空格,这个时候再运行就OK啦

但由于我一直想摁enter运行(其实像p2 就是在窗口右键点下run code运行的结果)所以它就一直换行,换行,换行……(我也要换行!!)

最后放几张找到的解析

写在最后:纯记录帖,记下了就不会犯这样的错误了!)应该不会有人好意思记录下这种级别的bug吧…没事 我相信一定还有学习初期的小白会掉这个坑,然后冥思苦想,最后找个理由把自己说服过去解释通,本人就很爱钻这种牛角尖,一个点想不通就卡住开始钻!呜呜终于写完了 再也不要熬夜给自己解释bug了!下机

  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值