有關(guān)于scanf函數(shù)的簡(jiǎn)單交流
曾經(jīng)錯(cuò)的幾個(gè)地方:(xpsp2,vc6.0環(huán)境下)
1.空白符問(wèn)題
#include
main()
{
int a;
printf("input the datan");
scanf("%dn",&a);//這里多了一個(gè)回車符n
printf("%d",a);
return 0;
}
結(jié)果要輸入兩個(gè)數(shù)程序才結(jié)束,而不是預(yù)期的一個(gè)。why?
原因:用空白符結(jié)尾時(shí),scanf會(huì)跳過(guò)空白符去讀下一個(gè)字符,所以你必須再輸入一個(gè)數(shù)。這里的空白符包括空格,制表符,換行符,回車符等。所以如果你用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.緩沖區(qū)問(wèn)題(“垃圾”字符)
這是一個(gè)非常容易錯(cuò)的地方,我就錯(cuò)過(guò)多次。
#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è)n,第二個(gè)scanf讀取這個(gè)n。然后輸入b和第二個(gè)回車,同樣的,第三個(gè)scanf讀取了b,第四個(gè)scanf讀取了第二個(gè)回車符。第五個(gè)讀取了c。所以五個(gè)scanf都執(zhí)行了,并沒(méi)有提前結(jié)束。只不過(guò)有的scanf讀取到了回車符而已。
解決方法:把程序改成這樣就可以了:
for( i = 0; i < n; i++){
scanf("%c",&c[i]);
fflush(stdin);//刷新緩沖區(qū)
}
或者不用scanf,而用gets()函數(shù),如:
#include
main()
{
char c[5];
gets(c);
printf(c);
return 0;
}
但要注意:這個(gè)函數(shù)自動(dòng)把你最后敲的回車轉(zhuǎn)換為字符'