關於檢查scanf的返回值

  很多人在使用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章