曾經錯的幾個地方:(xpsp2,vc6.0環(huán)境下)
1.空白符問題
#include
main()
{
int a;
printf("input the datan");
scanf("%dn",&a);//這里多了一個回車符n
printf("%d",a);
return 0;
}
結果要輸入兩個數程序才結束,而不是預期的一個。why?
原因:用空白符結尾時,scanf會跳過空白符去讀下一個字符,所以你必須再輸入一個數。這里的空白符包括空格,制表符,換行符,回車符等。所以如果你用scanf("%d ",&a)也會出現同樣的問題。
解決方法:這種錯誤大多是輸入的時候不小心,多注意一點就好了。這種問題也不好檢查,編譯沒有問題,一個空格也不容易看出來。當你的程序出現上面的問題時,自己對照檢查一下就可以了。
2.緩沖區(qū)問題(“垃圾”字符)
這是一個非常容易錯的地方,我就錯過多次。
#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)就會“提前”結束了.
原因:輸入a和第一個回車后,a和這個回車符都留在緩沖區(qū)中。第一個scanf讀取了a,但是輸入緩沖區(qū)里面還留有一個n,第二個scanf讀取這個n。然后輸入b和第二個回車,同樣的,第三個scanf讀取了b,第四個scanf讀取了第二個回車符。第五個讀取了c。所以五個scanf都執(zhí)行了,并沒有提前結束。只不過有的scanf讀取到了回車符而已。
解決方法:把程序改成這樣就可以了:
for( i = 0; i < n; i++){
scanf("%c",&c[i]);
fflush(stdin);//刷新緩沖區(qū)
}
或者不用scanf,而用gets()函數,如:
#include
main()
{
char c[5];
gets(c);
printf(c);
return 0;
}
但要注意:這個函數自動把你最后敲的回車轉換為字符'