[問題] scanf及fflush的問題?

看板C_and_CPP作者 (owo)時間9年前 (2015/06/19 18:21), 9年前編輯推噓4(4014)
留言18則, 7人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) GNU GCC using Code::Blocks 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) none 問題(Question): 在迴圈中的scanf標準化輸入中如果是scanf("%lf,%lf",&num1,&num2) 則會正常讀入 若是改成scanf("(%lf,%lf)",&num1,&num2) 則會出現錯誤(只能讀入第一次的內容) 若是加入fflush(stdin)就會需要多輸入一個空白 迴圈外有一個printf、一個scanf、再一個printf 完整的程式碼在這邊 http://paste.plurk.com/show/2189312/ 餵入的資料(Input): 3 (1,2) (3,4) (5,6) 預期的正確結果(Expected Output): 1 2 3 4 5 6 錯誤結果(Wrong Output): 1 2 1 2 1 2 程式碼(Code):(請善用置底文網頁, 記得排版) http://paste.plurk.com/show/2189312/ 補充說明(Supplement): 很少用到標準化輸入 不知道為什麼會出這種問題 用了fflush以後會變成scanf無法用空白來決定輸入是否停止 所以如果我把(1,2) (3,4)中間用空白來打 就沒辦法讀了 如有不清 我會再補充 感謝大家m(_ _)m -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.115.159.237 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1434709283.A.6BF.html

06/19 18:29, , 1F
改成 scanf("%d ") 和 scanf("(%lf,%lf) ")
06/19 18:29, 1F

06/19 18:31, , 2F
然後 flush(stdin) 是 undefined behavior
06/19 18:31, 2F
還是沒辦法欸... 可是如果我其他的完全不動, 只把fflush拿掉 在把scanf第一個引數內的左括弧拿掉 scanf("%lf,%lf)",&num1,&num2); 這樣就會是正常的 不解...... ※ 編輯: sr29 (59.115.159.237), 06/19/2015 21:01:45

06/19 21:35, , 3F
我意思是scanf 第一個參數,結尾加一個空白 @@
06/19 21:35, 3F

06/19 21:43, , 4F
恩 我有加過了 第二個scanf也是一樣 結果還是無法orz
06/19 21:43, 4F

06/19 23:10, , 5F

06/19 23:11, , 6F
從 16 行開始,有變更 如果大大有什麼問題,再發信問我
06/19 23:11, 6F

06/20 00:50, , 7F
06/20 00:50, 7F

06/20 16:27, , 8F
改成空白放前面, 也就是 scanf(" (%lf,%lf)",... 這樣呢?
06/20 16:27, 8F
easyget大大跟yvb大大的方法我都試過了 結果都有跑出預期的結果 真的不懂為啥orz 懇請各位開示 ( 從來沒遇過這種情形.... ) ※ 編輯: sr29 (59.115.159.237), 06/20/2015 16:47:35

06/20 17:14, , 9F
問題在於大部份的 %xx 會先吃掉空白再讀, 但非 % 字元不會
06/20 17:14, 9F

06/20 17:15, , 10F
所以 ( 就真的只吃 ( 不吃空白, 於是輸入之間的空白就卡住
06/20 17:15, 10F

06/20 17:15, , 11F
而在格式字串裡放空白則是一個空白吃全部連續的空白
06/20 17:15, 11F

06/20 17:16, , 12F
這樣就把輸入之間的空白給吃掉了
06/20 17:16, 12F

06/20 17:16, , 13F
另外要注意的是 %xx 會停在它看不懂的第一個字
06/20 17:16, 13F

06/20 17:17, , 14F
而且**不會先幫你吃掉空白**, 這對後讀的讀取會造成影響
06/20 17:17, 14F

06/20 17:18, , 15F
(以上我推文中的「空白」皆指 whitespace, 廣義的空白字元)
06/20 17:18, 15F

06/20 17:47, , 16F
了解了 感謝!
06/20 17:47, 16F

06/22 20:13, , 17F
scanf("%*1[(]%lf%*1[,]%lf%*1[)]",..) ?
06/22 20:13, 17F

06/24 11:54, , 18F
有試過了 樓上那個好像也可以!
06/24 11:54, 18F
文章代碼(AID): #1LW-qZQ_ (C_and_CPP)