用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)
留言列表