close

用scanf  遇到一個問題

當 用scanf("%d", &ivar);  時 !

當使用者輸入非數字字串會導致 scanf回覆錯誤 但緩衝區內仍有資料導致下次再用 scanf 會誤判到就的資料 • %d 是 跳過所有 white space, 由鍵盤緩衝區裡讀取連續 0~9 之間的十進位數 字, 轉換為二進位, 如果除了 white space 之外只看到不是 0~9 的字元, scanf("%d",&x) 回傳 0 (注意是回傳 0 代表這個命令沒有成功, x 的數值不變 )

 

 

scanf()函數接收輸入數據時,遇以下情況結束一個數據的輸入:(不是結束該scanf函數,scanf函數僅在每一個數據域均有數據,並按回車後結束)。 
  ①   遇空格、「回車」、「跳格」鍵。 
  ②   遇寬度結束。 
  ③   遇非法輸入。 
鍵盤緩衝區就可能有殘餘信息問題。 
scanf()函數應該只是掃瞄stdin流,這個殘存信息是在stdin中 
解決就要在scanf()函數之後加個fflush(stdin)

原本有想用  fflush() 函式 去清!! 但發現 fflush() 函式 不是每個編譯器都有支援

請注意: fflush(stdin) 在 線上 測試系統 e-Tutor 上, 在 linux GNU gcc/g++, 在 Mac clang gcc/g++ 都沒有作用, fflush(輸出串流) 是有明確定 義的動作, fflush(輸入串流) 則沒有明確的定義, 請避免使用

 

只好改這樣 去清

 

 

  if (scanf("%d",&ivar)==0) {
   
  /* 清除 input buffer */
  scanf("%*[^\n]");
   
  /* 上面的 scanf() 不會 "吃掉" input buffer 裡最後的 '\n'.
  所以要加多一個 getchar() 來把 '\n' 消掉 */
  getchar();
  }

 

詳細請看 http://iverjisty.logdown.com/posts/87400/appears-to-be-quite-fun-blog

 

 

 

 

參考 

http://squall.cs.ntou.edu.tw/cprog/practices/scanfCommonTraps.pdf

http://blog.xuite.net/mb1016.flying/linux/28543400-fflush(stdout)

 

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 立你斯 的頭像
    立你斯

    立你斯學習記錄

    立你斯 發表在 痞客邦 留言(0) 人氣()