在寫C代碼時難免對一些知識點不熟悉,導致犯錯,今天分享幾點小知識給大家。
空白符問題
#includeint main(void) { int a; printf("input the data "); scanf("%d ",&a); //這里多了一個回車符 printf("%d",a); return 0; }
結(jié)果要輸入兩個數(shù)程序才結(jié)束,而不是預期的一個。why?
原因
用空白符結(jié)尾時,scanf會跳過空白符去讀下一個字符,所以你必須再輸入一個數(shù)。這里的空白符包括空格,制表符,換行符,回車符和換頁符。所以如果你用scanf("%d ",&a)也會出現(xiàn)同樣的問題。
解決方法
這種錯誤大多是輸入的時候不小心,多注意一點就好了。這種問題也不好檢查,編譯沒有問題,一個空格也不容易看出來。當你的程序出現(xiàn)上面的問題時,自己對照檢查一下就可以了。
回車符也占位
#includemain() { int n = 5; char c[n]; for(int i = 0; i < n; i++) c[i] = scanf("%c",&c[i]); printf(c); return 0; }
如果輸入:
a b c
那么循環(huán)就會“提前”結(jié)束了。
原因
輸入a和第一個回車后,a和這個回車符都留在緩沖區(qū)中。第一個scanf讀取了a,但是輸入緩沖區(qū)里面還留有一個 ,第二個scanf讀取這個 。然后輸入b和第二個回車,同樣的,第三個scanf讀取了b,第四個scanf讀取了第二個回車符。第五個讀取了c。所以五個scanf都執(zhí)行了,并沒有提前結(jié)束。只不過有的scanf讀取到了回車符而已。
解決方法
1.不輸入回車符,直接輸入字符。 2.用gets()函數(shù),如:
#includemain() { char c[5]; gets(c); printf(c); return 0; }
scanf()函數(shù)的參數(shù)輸入類型不匹配問題
在某度見到的問題:
#includemain() { int a=123; char c='t'; printf("input "); scanf("%d%c",&a,&c); scanf("%d%c",&a,&c); scanf("%d%c",&a,&c); printf("%d %c ",a,c); return 0; }
當輸入a 回車 后,會直接跳過下面2個scanf語句,直接輸出為:
123 t
原因
對于scanf("%d%c",&a,&c),scanf語句執(zhí)行時,其中有一個參數(shù)不匹配,那就從這個地方跳出,忽略這個scanf后面所有的參數(shù),而去執(zhí)行下一條語句。
解決方法
scanf()函數(shù)執(zhí)行成功時的返回值是成功讀取的變量數(shù),也就是說,你這個scanf()函數(shù)有幾個變量,如果scanf()函數(shù)全部正常讀取,它就返回幾。但這里還要注意另一個問題,如果輸入了非法數(shù)據(jù),鍵盤緩沖區(qū)就可能還有殘余信息問題。
比如:
#includemain() { int a=123,b; while(scanf("%d%d",&a,&b)!=2) fflush(stdin); printf("%d %d ",a,b); return 0; }
還有個辦法:只要用scanf("%[^ ]",strings); 就可以了。很神奇吧。還要注意方括號兩側(cè)都不能加空格。
審核編輯:湯梓紅
-
C語言
+關(guān)注
關(guān)注
180文章
7632瀏覽量
141548 -
程序
+關(guān)注
關(guān)注
117文章
3826瀏覽量
82941 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4379瀏覽量
64784 -
編譯
+關(guān)注
關(guān)注
0文章
679瀏覽量
33960 -
C代碼
+關(guān)注
關(guān)注
1文章
90瀏覽量
14766
原文標題:C語言中scanf函數(shù)的常見問題
文章出處:【微信號:單片機與嵌入式,微信公眾號:單片機與嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
C語言中指針函數(shù)和函數(shù)指針的概念及應用示例
printf和scanf什么意思

評論