當(dāng)前位置:首頁(yè) > 芯聞號(hào) > 充電吧
[導(dǎo)讀]曾經(jīng)錯(cuò)的幾個(gè)地方:(xpsp2,vc6.0環(huán)境下)1.空白符問(wèn)題#includemain(){int a;printf("input the data\n");scanf("%d\n",&a)

曾經(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)換為字符'