Re: [問題] getchar() 讀不到字元

看板C_and_CPP (C/C++)作者 (藍影)時間14年前 (2011/07/26 21:43), 編輯推噓1(1010)
留言11則, 5人參與, 最新討論串2/2 (看更多)
※ 引述《Nairoda (new)》之銘言:

07/26 20:26,
[Enter] = '\n'
07/26 20:26

07/26 20:29,
輸入數值enter 後, 程式直接停止執行.
07/26 20:29

07/26 20:40,
會不會是輸入數值後的 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

07/26 21:45, , 1F
fflush 不能用在stdin...
07/26 21:45, 1F

07/26 21:47, , 2F
我可能換個表達會好點.
07/26 21:47, 2F
※ 編輯: tropical72 來自: 180.177.78.41 (07/26 21:49)

07/26 21:47, , 3F
t大怕引來太多回文吼 XD
07/26 21:47, 3F

07/26 21:51, , 4F
感謝!!
07/26 21:51, 4F

07/26 21:56, , 5F
嗯,是怕表達方式、文字綴詞不夠清晰. ^^"
07/26 21:56, 5F

07/26 22:04, , 6F
補一下:fflush(stdin)未定義因為stdin預設非output/update
07/26 22:04, 6F

07/26 22:04, , 7F

07/26 22:05, , 8F
(啊有人推了 xDDDD)
07/26 22:05, 8F

07/26 22:08, , 9F
07/26 22:08, 9F

07/26 22:10, , 10F
(引用 c-faq 好方便喔 xD)
07/26 22:10, 10F

07/26 23:15, , 11F
修正一下:應該說可能未定義因為stdin可能非output/update
07/26 23:15, 11F
文章代碼(AID): #1EBiHamA (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1EBiHamA (C_and_CPP)