我终于明白了!!
这是今天在写一道很简单的程序题时,偶然发现的一个“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语言格式化输入的文章
有讲到空格、换行、和缓冲区,感觉讲的很细致!!(放个链接)满心欢喜收藏,以为拿下了,结果晚上就被摆了这一道!
格式化输入的文章https://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了!下机