→ 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:(引用 c-faq 好方便喔 xD) 07/26 22:10
→ Favonia:修正一下:應該說可能未定義因為stdin可能非output/update 07/26 23:15