在寫(xiě)代碼時(shí)總是不小心在這里犯錯(cuò),所以特意查了一下這個(gè)函數(shù),并且做以整理,現(xiàn)分享給大家。
1.空白符問(wèn)題
#include
main()
{
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ì)跳過(guò)空白符去讀下一個(gè)字符,所以你必須再輸入一個(gè)數(shù)。這里的空白符包括空格,制表符,換行符,回車符和換頁(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ì)照檢查一下就可以了。
2.回車符也占位。
#include
main()
{
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)就會(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í)行了,并沒(méi)有提前結(jié)束。只不過(guò)有的scanf讀取到了回車符而已。
解決方法:
1.不輸入回車符,直接輸入字符。
2.用gets()函數(shù),如:
#include
main()
{
char c[5];
gets(c);
printf(c);
return 0;
}
3.scanf()函數(shù)的參數(shù)輸入類型不匹配問(wèn)題
這是我在百度時(shí)見(jiàn)到的問(wèn)題,還沒(méi)遇到。拿來(lái)整理,以備日后需要。
#include
main()
{
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ì)直接跳過(guò)下面2個(gè)scanf語(yǔ)句,直接輸出為
123
t
原因:對(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ù),鍵盤緩沖區(qū)就可能還個(gè)有殘余信息問(wèn)題。
比如:
#include
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)注
180文章
7632瀏覽量
141684 -
代碼
+關(guān)注
關(guān)注
30文章
4900瀏覽量
70722
原文標(biāo)題:C語(yǔ)言中scanf函數(shù)的3種常見(jiàn)問(wèn)題與應(yīng)對(duì)技巧
文章出處:【微信號(hào):mcuworld,微信公眾號(hào):嵌入式資訊精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
評(píng)論