空白符問題
int main(void){int a;printf("input the data ");scanf("%d ",&a); //這里多了一個回車符printf("%d",a);return 0;}
結果要輸入兩個數程序才結束,而不是預期的一個。why?
原因用空白符結尾時,scanf會跳過空白符去讀下一個字符,所以你必須再輸入一個數。這里的空白符包括空格,制表符,換行符,回車符和換頁符。所以如果你用scanf("%d ",&a)也會出現同樣的問題。解決方法這種錯誤大多是輸入的時候不小心,多注意一點就好了。這種問題也不好檢查,編譯沒有問題,一個空格也不容易看出來。當你的程序出現上面的問題時,自己對照檢查一下就可以了。回車符也占位
main(){int n = 5;char c[n];for(int i = 0; i < n; i++)c[i] = scanf("%c",&c[i]);printf(c);return 0;}
如果輸入:
abc
那么循環就會“提前”結束了。
原因
輸入a和第一個回車后,a和這個回車符都留在緩沖區中。第一個scanf讀取了a,但是輸入緩沖區里面還留有一個 ,第二個scanf讀取這個 。然后輸入b和第二個回車,同樣的,第三個scanf讀取了b,第四個scanf讀取了第二個回車符。第五個讀取了c。所以五個scanf都執行了,并沒有提前結束。只不過有的scanf讀取到了回車符而已。
解決方法
1.不輸入回車符,直接輸入字符。 2.用gets()函數,如:main(){char c[5];gets(c);printf(c);return 0;}
scanf()函數的參數輸入類型不匹配問題
在某度見到的問題:
#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語句,直接輸出為:
123t
原因
對于scanf("%d%c",&a,&c),scanf語句執行時,其中有一個參數不匹配,那就從這個地方跳出,忽略這個scanf后面所有的參數,而去執行下一條語句。
解決方法
scanf()函數執行成功時的返回值是成功讀取的變量數,也就是說,你這個scanf()函數有幾個變量,如果scanf()函數全部正常讀取,它就返回幾。但這里還要注意另一個問題,如果輸入了非法數據,鍵盤緩沖區就可能還有殘余信息問題。
比如:
main(){int a=123,b;while(scanf("%d%d",&a,&b)!=2)fflush(stdin);printf("%d %d ",a,b);return 0;}
還有個辦法:只要用scanf("%[^ ]",strings); 就可以了。很神奇吧。還要注意方括號兩側都不能加空格。
-
C語言
+關注
關注
183文章
7644瀏覽量
145570 -
函數
+關注
關注
3文章
4417瀏覽量
67501 -
代碼
+關注
關注
30文章
4967瀏覽量
73960 -
編譯
+關注
關注
0文章
694瀏覽量
35158
原文標題:C語言中scanf函數的常見問題
文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
剖析C語言中scanf函數常見問題
評論