看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《Nairoda (new)》之銘言:
loveme00835:[Enter] = '\n'07/26 20:26
Nairoda:輸入數值enter 後, 程式直接停止執行.07/26 20:29
Nairoda:會不會是輸入數值後的 enter 被判讀成兩次 enter?07/26 20:40
不是這意思。 在你的原程式中,實際上輸入 123(Enter) 而 scanf 是以 White Space 為斷點沒錯,其中包含了 '\n', '\t', ' ', 讀進 123 之後,會留下 '\n' 還在你系統的輸入緩充區裡面。 所以當按下了 123(Enter) 之後,你的 getchar 讀到的一定是 '\n' 這種東西。 這種情況也不只 getchar會發生, scanf("%d%c",&integer, &ch); 一樣會發生。 ------- 沒有說有一定的處理技巧、方式,但常見的就是二種, 適用情況也不盡相同,自己去試試便知。 <sol 1> int num; char ch; scanf("%d%*c", &num); // %*c 代表讀入一個字元,但不存入變數 (就是丟掉一個字元) ch = getchar(); // 已把 '\n' 拿掉 <sol 2> int num; char ch; scanf("%d", &num); // 先讀入一個數字 while(getchar()!='\n'); // 直接把換行前的字元全都讀走 ch = getchar(); // 再讀入輸入之字元 類似的解決應還有一狗票,比較常看到「簡單」,「但不正確」的解法是: int num; char ch; scanf("%d", &num); fflush(stdin); // 這行有問題 ch = getchar(); fflush 簡單的說是刷新 (這樣翻嗎?不知道繁中有沒有人在翻) 緩衝區, 在標準上是對 stdout 才有作用,而上面程式碼是用在 stdin 上面, 這部份應是看 手邊compiler 如何實做, 一些人覺得用了沒問題,也有一些人最後發現這個 bug 抓很久 , ( 將 fflush 用在 stdin 之 bug ) fflush 小提一下就好,太深入易惹爭議。 -- YouLoveMe() ? LetItBe() : LetMeFree(); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.78.41
firejox:fflush 不能用在stdin... 07/26 21:45
tropical72:我可能換個表達會好點. 07/26 21:47
※ 編輯: tropical72 來自: 180.177.78.41 (07/26 21:49)
loveme00835:t大怕引來太多回文吼 XD 07/26 21:47
Nairoda:感謝!! 07/26 21:51
tropical72:嗯,是怕表達方式、文字綴詞不夠清晰. ^^" 07/26 21:56
Favonia:補一下:fflush(stdin)未定義因為stdin預設非output/update 07/26 22:04
Favonia:(啊有人推了 xDDDD) 07/26 22:05
Favonia:第二個方法可以看http://c-faq.com/stdio/stdinflush2.htm 07/26 22:08
Favonia:(引用 c-faq 好方便喔 xD) 07/26 22:10
Favonia:修正一下:應該說可能未定義因為stdin可能非output/update 07/26 23:15