C語言中scanf函數(shù)的3種常見問題與應(yīng)對技巧

在寫代碼時總是不小心在這里犯錯,所以特意查了一下這個函數(shù),并且做以整理,現(xiàn)分享給大家。

1.空白符問題

#include

main()

{ ??

?int a;

?printf("input the data ");

?scanf("%d ",&a);//這里多了一個回車符

? ?printf("%d",a);

?return 0;

}

結(jié)果要輸入兩個數(shù)程序才結(jié)束,而不是預(yù)期的一個。why?

原因:用空白符結(jié)尾時,scanf會跳過空白符去讀下一個字符,所以你必須再輸入一個數(shù)。這里的空白符包括空格,制表符,換行符,回車符和換頁符。所以如果你用scanf("%d ?",&a)也會出現(xiàn)同樣的問題。

解決方法:這種錯誤大多是輸入的時候不小心,多注意一點(diǎn)就好了。這種問題也不好檢查,編譯沒有問題,一個空格也不容易看出來。當(dāng)你的程序出現(xiàn)上面的問題時,自己對照檢查一下就可以了。

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)就會“提前”結(jié)束了.

原因:輸入a和第一個回車后,a和這個回車符都留在緩沖區(qū)中。第一個scanf讀取了a,但是輸入緩沖區(qū)里面還留有一個 ,第二個scanf讀取這個 。然后輸入b和第二個回車,同樣的,第三個scanf讀取了b,第四個scanf讀取了第二個回車符。第五個讀取了c。所以五個scanf都執(zhí)行了,并沒有提前結(jié)束。只不過有的scanf讀取到了回車符而已。

解決方法:

1.不輸入回車符,直接輸入字符。

2.用gets()函數(shù),如:

#include

main()

{ ??

?char c[5];

?gets(c);

?printf(c);

?return 0;

}

3.scanf()函數(shù)的參數(shù)輸入類型不匹配問題

這是我在百度時見到的問題,還沒遇到。拿來整理,以備日后需要。

#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 回車 后,會直接跳過下面2個scanf語句,直接輸出為

123

t

原因:對于scanf("%d%c",&a,&c),scanf語句執(zhí)行時,其中有一個參數(shù)不匹配,那就從這個地方跳出,忽略這個scanf后面所有的參數(shù),而去執(zhí)行下一條語句。?

解決方法:scanf()函數(shù)執(zhí)行成功時的返回值是成功讀取的變量數(shù),也就是說,你這個scanf()函數(shù)有幾個變量,如果scanf()函數(shù)全部正常讀取,它就返回幾。但這里還要注意另一個問題,如果輸入了非法數(shù)據(jù),鍵盤緩沖區(qū)就可能還個有殘余信息問題。

比如:

#include

?main()

{

?int a=123,b;

?while(scanf("%d%d",&a,&b)!=2)

? fflush(stdin);

?printf("%d %d ",a,b);

?return 0;

}

還有個辦法:只要用scanf("%[^ ]",strings); 就可以了。很神奇吧。還要注意方括號兩側(cè)都不能加空格。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容