[問題] printf會輸出多餘的東西?

看板C_and_CPP (C/C++)作者 (wnuiayldh)時間16年前 (2009/07/02 01:03), 編輯推噓4(4016)
留言20則, 5人參與, 最新討論串1/1
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

07/02 01:04, , 1F
ch 會抓到換行字元
07/02 01:04, 1F
ch抓到\n所以印出空白行 不懂為什麼印出1 2 3 4 r怎麼沒被a給讀走@@? ※ 編輯: deepking 來自: 122.122.32.152 (07/02 01:18)

07/02 01:23, , 2F
你要不要多印個i來看看?
07/02 01:23, 2F

07/02 01:24, , 3F
因為我猜你第二次的1 2 3 4是i=2的情況
07/02 01:24, 3F

07/02 01:25, , 4F
妳每次按下的所有東西,都會存放在一個緩衝區,
07/02 01:25, 4F

07/02 01:26, , 5F
因為第二次scanf我猜沒讀到東西,用舊的數值
07/02 01:26, 5F

07/02 01:26, , 6F
在windows下吧, 會有\r\n兩個換行字元在stdin內....
07/02 01:26, 6F

07/02 01:27, , 7F
包含空白與按下的Enter,scanf在讀入東西的時候,
07/02 01:27, 7F

07/02 01:28, , 8F
除了符合輸入類型的東西,剩下都會放回緩衝區,
07/02 01:28, 8F

07/02 01:29, , 9F
所以如果先scanf("%d", x);鍵入5,x的值為5,
07/02 01:29, 9F

07/02 01:31, , 10F
但是按下5之後還按了Enter,因此總共輸入了兩樣東西,
07/02 01:31, 10F

07/02 01:32, , 11F
一個是5,後面那個是\n,因此再scanf("%c", ch);
07/02 01:32, 11F

07/02 01:34, , 12F
就會讀到那個\n,ch裡面裝的是換行符號!
07/02 01:34, 12F

07/02 01:34, , 13F
我講的很草率,不知道有沒有幫到你... (默
07/02 01:34, 13F

07/02 01:34, , 14F
有請高手補完... (逃
07/02 01:34, 14F

07/02 01:39, , 15F
謝謝大家^^,還在想接下來abcd怎沒讀到東西?是因為\r\n?
07/02 01:39, 15F

07/02 01:43, , 16F
大大講得很詳細了@@ 喚醒久遠的記憶...
07/02 01:43, 16F

07/02 10:53, , 17F
ch 先讀到 \n, 那個 r 還在 buffer 裡, 之後的 %lf 讀不到
07/02 10:53, 17F

07/02 10:53, , 18F
scanf 有傳回值, 傳回他確實收到多少個輸入, 印出來看看
07/02 10:53, 18F

07/02 10:53, , 19F
就會知道發生什麼事了
07/02 10:53, 19F

07/02 20:44, , 20F
恩,總算懂了,現在用sscanf,方便多了!
07/02 20:44, 20F
文章代碼(AID): #1AIvRed7 (C_and_CPP)
文章代碼(AID): #1AIvRed7 (C_and_CPP)