哦這。。!C語言scanf輸入的坑爹之處


一、

今天閑來無事,跑去A題,本想3sA了poj1004,結果搞了10分鍾,最令人困惑的問題就是為什么定義了double類型的變量,但是用scanf輸入的時候標識符用%f的話,輸入並不能完成,也就是說輸入不會起作用,后來查找資料,才知道,原來用double 輸入的時候標識符是%lf,注意這里是L和F,不是1和f

經過修正終於搞定,分分鍾A了這個水題。

然而后來再想 A 就A不過去了,,,,並不知道為什么。好吧,忽略這種細節,沒什么難度的水題沒必要太在意,代碼如下:

1 #include<cstdio>
2 int main(){
3     double t,d;
4     for(int i=0;i<12;i++){
5         scanf("%lf",&t);
6         d+=t;
7     }
8     printf("$%.2f",d/12);
9 } 

 二、除了上面的坑之外,scanf輸入還有一些坑爹的小細節:

在用scanf輸入的時候,如果輸入的是字符%c,則scanf會將空白符(空格,回車,tab)一並讀入,所以一般要加一個getchar來獲取空白符。

1 scanf("%c",&t);//這種寫法,t中存儲的也可以有空白符

 

解決空白字符被當作char讀入的問題

在做題的時候,有時會碰到輸入數據給的不規范的情況,比如一行結束后不只有一個回車而是多個,再比如很多個空白符之后才是回車,由於空白符(Tab,回車,空格)會被當作char ,所以今天我們來解決這個問題

1、如果輸入不存在不規范:getchar()或%*c

但是畢竟在后面加一個getchar實在是很麻煩的做法,所以,我們可以用scanf的另一種寫法來“吃掉”回車符:

1 char a,b;
2 int num;
3 scanf("%c%c%*c%d",&a,&b,&num);//注意這里的%*c

這里我給大家演示另外一種方法,就是%*這表示這個輸入讀取之后我們是不給他變量來存儲的,這樣就相當於“吃掉了”中間的字符,前兩個字符以及最后的數字都會正確讀取。

如果我們把這一點用在scanf的format串的末尾,就可以做到“吃掉”回車了,為了怕我忘,我還是寫下來吧:

這種帶星號的用法,叫做“賦值禁止字符”.,在scanf的返回值中,是不會計算%*的這量的,也就是說,scanf返回的值是成功存入的變量的個數。

1 //賦值禁止字符的使用
2 char a,b,c;
3 scanf("%c%c%c%*c",&a,&b,&c);//回車就會被吃掉

 

但是如果輸入的是字符串%s,則scanf會忽略空白符。

並且,%s其實也可以存儲在字符中,不過%s的缺點是,如果要把值存儲在字符中,則只存儲第一個字符,其余字符就會被舍棄,這樣就會造成字符的丟失

1 scanf("%s",&t);//可能造成字符丟失

 

2.如果數據不規范,不能保證一定符合格式,更穩妥的方法如下:

scanf會跳過%c之前所有的空白符,同理,如果不是空格而是\t或\n,則會跳過所有Tab和所有回車。

 

1 scanf(" %c",&t);//注意這里在%c之前有空格!!!

 

這次有個題就因為這個wa了兩天,坑死我了。。。5555555555

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM