一、
今天閑來無事,跑去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