空白符問(wèn)題
int main(void){int a;printf("input the data ");scanf("%d ",&a); //這里多了一個(gè)回車(chē)符printf("%d",a);return 0;}
結(jié)果要輸入兩個(gè)數(shù)程序才結(jié)束,而不是預(yù)期的一個(gè)。why?
原因用空白符結(jié)尾時(shí),scanf會(huì)跳過(guò)空白符去讀下一個(gè)字符,所以你必須再輸入一個(gè)數(shù)。這里的空白符包括空格,制表符,換行符,回車(chē)符和換頁(yè)符。所以如果你用scanf("%d ",&a)也會(huì)出現(xiàn)同樣的問(wèn)題。解決方法這種錯(cuò)誤大多是輸入的時(shí)候不小心,多注意一點(diǎn)就好了。這種問(wèn)題也不好檢查,編譯沒(méi)有問(wèn)題,一個(gè)空格也不容易看出來(lái)。當(dāng)你的程序出現(xiàn)上面的問(wèn)題時(shí),自己對(duì)照檢查一下就可以了。回車(chē)符也占位
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è)回車(chē)后,a和這個(gè)回車(chē)符都留在緩沖區(qū)中。第一個(gè)scanf讀取了a,但是輸入緩沖區(qū)里面還留有一個(gè) ,第二個(gè)scanf讀取這個(gè) 。然后輸入b和第二個(gè)回車(chē),同樣的,第三個(gè)scanf讀取了b,第四個(gè)scanf讀取了第二個(gè)回車(chē)符。第五個(gè)讀取了c。所以五個(gè)scanf都執(zhí)行了,并沒(méi)有提前結(jié)束。只不過(guò)有的scanf讀取到了回車(chē)符而已。
解決方法
1.不輸入回車(chē)符,直接輸入字符。 2.用gets()函數(shù),如:main(){char c[5];gets(c);printf(c);return 0;}
scanf()函數(shù)的參數(shù)輸入類(lèi)型不匹配問(wèn)題
在某度見(jiàn)到的問(wèn)題:
#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 回車(chē) 后,會(huì)直接跳過(guò)下面2個(gè)scanf語(yǔ)句,直接輸出為:
123t
原因
對(duì)于scanf("%d%c",&a,&c),scanf語(yǔ)句執(zhí)行時(shí),其中有一個(gè)參數(shù)不匹配,那就從這個(gè)地方跳出,忽略這個(gè)scanf后面所有的參數(shù),而去執(zhí)行下一條語(yǔ)句。
解決方法
scanf()函數(shù)執(zhí)行成功時(shí)的返回值是成功讀取的變量數(shù),也就是說(shuō),你這個(gè)scanf()函數(shù)有幾個(gè)變量,如果scanf()函數(shù)全部正常讀取,它就返回幾。但這里還要注意另一個(gè)問(wèn)題,如果輸入了非法數(shù)據(jù),鍵盤(pán)緩沖區(qū)就可能還有殘余信息問(wèn)題。
比如:
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語(yǔ)言
+關(guān)注
關(guān)注
183文章
7643瀏覽量
145240 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4413瀏覽量
67263 -
代碼
+關(guān)注
關(guān)注
30文章
4959瀏覽量
73585 -
編譯
+關(guān)注
關(guān)注
0文章
692瀏覽量
35038
原文標(biāo)題:C語(yǔ)言中scanf函數(shù)的常見(jiàn)問(wèn)題
文章出處:【微信號(hào):c-stm32,微信公眾號(hào):STM32嵌入式開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
為什么c語(yǔ)言沒(méi)有輸出?
C語(yǔ)言回調(diào)函數(shù)原來(lái)這么簡(jiǎn)單
C語(yǔ)言中實(shí)現(xiàn)函數(shù)宏的三種方式
單片機(jī)c語(yǔ)言中定義字節(jié)怎么定義?
請(qǐng)問(wèn)C語(yǔ)言中整形溢出會(huì)產(chǎn)生哪些異常行為?
請(qǐng)問(wèn)C語(yǔ)言中整形溢出對(duì)哪些應(yīng)用場(chǎng)景影響較大?
Typedef在C語(yǔ)言中的應(yīng)用
CW32系統(tǒng)有哪些常見(jiàn)問(wèn)題?
scanf函數(shù)介紹
C語(yǔ)言的常見(jiàn)算法
C語(yǔ)言中的內(nèi)聯(lián)函數(shù)與宏
Windows環(huán)境下32位匯編語(yǔ)言中文資料
deepin 25系統(tǒng)安裝常見(jiàn)問(wèn)題
剖析C語(yǔ)言中scanf函數(shù)常見(jiàn)問(wèn)題
評(píng)論