很多人在使用scanf的時候都不會去檢查它的返回值, 包括我在這之前也沒有去注意它, 如果你方便去翻翻c語言的教科書, 估計也很難找到有檢查scanf的例子或代碼段, 至少我還沒有見過, 當然, 書上的代碼畢竟只是一個練習, 和真正用於產品級別的代碼有很大的差別。
一個偶然的機會, 讓我注意到檢查scanf返回值的重要性, 寫下來和大家分享一下:)
下面是一個最簡單不過的scanf用法,但卻有隱患:
int n;
scanf( "%d", &n);
...
scanf要求取一個整數,但如果輸入的是一個字母,或其它不是數字的字符時,情況會怎麼呢? 結果是scanf不讀取數據,不修改n的值直接返回了,這樣,n就變成了一個未被初始化的變量,其值不可確定,因爲其值不確定,所以就算你對n作是否合法的判斷,也還是可能會有問題,
你也許會說,用戶應該會輸入一個合法的值的,但是,有時scanf並不總是從鍵盤中讀入數據,它可能從其它的設備中去讀,例如管道,UNIX中允許這樣的玩法,
你也許還會說,情況沒有哪麼糟了,可以先初始化n爲零,再去判斷n是否合法,例如下面這樣:
int n = 0;
scanf( "%d", &n);
if (n != 0) {
//OK,讀到用戶的值了
}
這樣好像還是有麻煩啊,這個初始值你怎麼定義纔好? 0嗎? 程序是需要0的時候怎麼辦?
讓我們再看下面的代碼,要求用戶輸入一個大於0的數爲止:
int n;
for(;;) {
printf( "pls input:");
scanf( "%d", &n);
if (n > 0) {
break;
}
}
上面的代碼中,當用戶輸入的不是一個整數時,會死循環,而不是用戶想要的:當用戶輸入非法值時一直讓讓用戶輸入一個合法值
爲止。爲什麼會這樣呢,因爲當scanf檢查到所輸入的是不合法的值時,它並不會讀取它,因此數據會留在緩衝區中,當下一次調用scanf時,會去讀緩衝區中的數據,因此仍然會讀到一個非法的值。
解決以上問題最簡單的辦法,就是在使用scanf的時候,檢查它的返回值來判斷scanf是否正確地讀到了數據。
------------------------------------------------------------------------------------------------------------------------------------------
轉載請註明出處: http://www.tzsblog.com