空白符問題
int main(void){int a;printf("input the data ");scanf("%d ",&a); //這里多了一個(gè)回車符printf("%d",a);return 0;}
結(jié)果要輸入兩個(gè)數(shù)程序才結(jié)束,而不是預(yù)期的一個(gè)。why?
原因用空白符結(jié)尾時(shí),scanf會(huì)跳過空白符去讀下一個(gè)字符,所以你必須再輸入一個(gè)數(shù)。這里的空白符包括空格,制表符,換行符,回車符和換頁符。所以如果你用scanf("%d ",&a)也會(huì)出現(xiàn)同樣的問題。解決方法這種錯(cuò)誤大多是輸入的時(shí)候不小心,多注意一點(diǎn)就好了。這種問題也不好檢查,編譯沒有問題,一個(gè)空格也不容易看出來。當(dāng)你的程序出現(xiàn)上面的問題時(shí),自己對(duì)照檢查一下就可以了。回車符也占位
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
那么循環(huán)就會(huì)“提前”結(jié)束了。
原因
輸入a和第一個(gè)回車后,a和這個(gè)回車符都留在緩沖區(qū)中。第一個(gè)scanf讀取了a,但是輸入緩沖區(qū)里面還留有一個(gè) ,第二個(gè)scanf讀取這個(gè) 。然后輸入b和第二個(gè)回車,同樣的,第三個(gè)scanf讀取了b,第四個(gè)scanf讀取了第二個(gè)回車符。第五個(gè)讀取了c。所以五個(gè)scanf都執(zhí)行了,并沒有提前結(jié)束。只不過有的scanf讀取到了回車符而已。
解決方法
1.不輸入回車符,直接輸入字符。 2.用gets()函數(shù),如:main(){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;}
當(dāng)輸入a 回車 后,會(huì)直接跳過下面2個(gè)scanf語句,直接輸出為:
123t
原因
對(duì)于scanf("%d%c",&a,&c),scanf語句執(zhí)行時(shí),其中有一個(gè)參數(shù)不匹配,那就從這個(gè)地方跳出,忽略這個(gè)scanf后面所有的參數(shù),而去執(zhí)行下一條語句。
解決方法
scanf()函數(shù)執(zhí)行成功時(shí)的返回值是成功讀取的變量數(shù),也就是說,你這個(gè)scanf()函數(shù)有幾個(gè)變量,如果scanf()函數(shù)全部正常讀取,它就返回幾。但這里還要注意另一個(gè)問題,如果輸入了非法數(shù)據(jù),鍵盤緩沖區(qū)就可能還有殘余信息問題。
比如:
main(){int a=123,b;while(scanf("%d%d",&a,&b)!=2)fflush(stdin);printf("%d %d ",a,b);return 0;}
還有個(gè)辦法:只要用scanf("%[^ ]",strings); 就可以了。很神奇吧。還要注意方括號(hào)兩側(cè)都不能加空格。
-
C語言
+關(guān)注
關(guān)注
183文章
7642瀏覽量
144625 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4406瀏覽量
66843 -
代碼
+關(guān)注
關(guān)注
30文章
4941瀏覽量
73151 -
編譯
+關(guān)注
關(guān)注
0文章
688瀏覽量
34950
原文標(biāo)題:C語言中scanf函數(shù)的常見問題
文章出處:【微信號(hào):c-stm32,微信公眾號(hào):STM32嵌入式開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
scanf函數(shù)介紹
C語言的分支結(jié)構(gòu)介紹
C語言宏拼接運(yùn)算符典型使用
Arty移植蜂鳥E203后,發(fā)現(xiàn)不支持scanf函數(shù),怎么解決?
ZYNQ UltraScalePlus RFSOC QSPI Flash固化常見問題說明
C語言中的內(nèi)聯(lián)函數(shù)與宏
PCBA代工避坑指南:常見問題+解決方案全解析
Windows環(huán)境下32位匯編語言中文資料
深入理解C語言:C語言循環(huán)控制
deepin 25系統(tǒng)安裝常見問題
電機(jī)故障診斷常見誤區(qū)的剖析
EE-62:在C語言中訪問短字內(nèi)存
EE-128:C語言中的DSP:從C調(diào)用匯編類成員函數(shù)

剖析C語言中scanf函數(shù)常見問題
評(píng)論