看板 C_and_CPP 關於我們 聯絡資訊
你要先理解輸入串列這個概念 你所輸入進去的東西 在電腦中會視為一串連續的字 這包含了你的 Enter 鍵等等的輸入 scanf 只是往後去拿出一個你所需要的東西出來 在碰到不是它要的東西的時候 scanf 除了停下來外 還會把這個不是它要的東西給留在輸入串列裡 因此在問題一中 你如果輸入 ? 由於 scanf 發現 ? 不是你要的 所以把 ? 留在裡面後回傳 如果不清除的話 之後就會一直讀到那個 ? 一直輸入錯誤 問題二也是 你輸入 n 之後 後面至少還留了你按的那個 Enter (即 '\n') 於是也是要把後面清掉之後再做輸入 以防那個 Enter 影響到程式其他地方需要的東西 講到這裡 再回頭講 FLUSH 這個 macro 你仔細看之後就會發現 它的作用是一直從輸入串列中讀字 讀到讀進 '\n' 時才停止 這就是幫你把輸入串列中尾巴剩下到你按換行為止的東西全部讀進來 --- 至於為什麼有時候不清不會有事 那是因為許多 scanf 的格式會自動忽略在你要的東西前面的空白及換行 (嚴格說來是 whitespace 啦 不過在這裡只要知道它包含空白和換行就好) 包括所有輸入數字的格式以及 %s 都會 而 scanf("%c"...) 則和 getchar() 一樣是不會去忽略那些東西的 所以有時不清不會出事 有時不清會出事 就是那些留在串列裡的 Enter 的關係 -- [LPH] Oops, your OOP's a problem? 說: 你現在還是看不到狗? ************* 說: 看得到 只是 他們不會跑 就一直呆呆在那邊 一直在起點 [LPH] Oops, your OOP's a problem? 說: 你要按"ㄅㄧㄤˋ"它們才會跑啊@@" -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.250.80
gnawnoraa:感謝感謝~! 終於知道為什麼會這樣了~~ 08/18 18:41