看板 C_and_CPP 關於我們 聯絡資訊
int i; char ch; double a, b, c, d for(i=1; i<10; i++){ scanf("%c", &ch); scanf("%lf %lf %lf %lf", &a, &b, &c, &d); printf("%c %f %f %f %f\n", ch, a, b, c, d); } 連輸入r 1 2 3 4 第一次輸出完後 會多印出一行空白 並且又多印一次1 2 3 4(沒有r) 找很久還是不知道錯在那? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.122.32.152
ledia:ch 會抓到換行字元 07/02 01:04
ch抓到\n所以印出空白行 不懂為什麼印出1 2 3 4 r怎麼沒被a給讀走@@? ※ 編輯: deepking 來自: 122.122.32.152 (07/02 01:18)
weiyucsie:你要不要多印個i來看看? 07/02 01:23
weiyucsie:因為我猜你第二次的1 2 3 4是i=2的情況 07/02 01:24
sinsendo:妳每次按下的所有東西,都會存放在一個緩衝區, 07/02 01:25
weiyucsie:因為第二次scanf我猜沒讀到東西,用舊的數值 07/02 01:26
VictorTom:在windows下吧, 會有\r\n兩個換行字元在stdin內.... 07/02 01:26
sinsendo:包含空白與按下的Enter,scanf在讀入東西的時候, 07/02 01:27
sinsendo:除了符合輸入類型的東西,剩下都會放回緩衝區, 07/02 01:28
sinsendo:所以如果先scanf("%d", x);鍵入5,x的值為5, 07/02 01:29
sinsendo:但是按下5之後還按了Enter,因此總共輸入了兩樣東西, 07/02 01:31
sinsendo:一個是5,後面那個是\n,因此再scanf("%c", ch); 07/02 01:32
sinsendo:就會讀到那個\n,ch裡面裝的是換行符號! 07/02 01:34
sinsendo:我講的很草率,不知道有沒有幫到你... (默 07/02 01:34
sinsendo:有請高手補完... (逃 07/02 01:34
deepking:謝謝大家^^,還在想接下來abcd怎沒讀到東西?是因為\r\n? 07/02 01:39
deepking:大大講得很詳細了@@ 喚醒久遠的記憶... 07/02 01:43
ledia:ch 先讀到 \n, 那個 r 還在 buffer 裡, 之後的 %lf 讀不到 07/02 10:53
ledia:scanf 有傳回值, 傳回他確實收到多少個輸入, 印出來看看 07/02 10:53
ledia:就會知道發生什麼事了 07/02 10:53
deepking:恩,總算懂了,現在用sscanf,方便多了! 07/02 20:44