看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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
bibo9901: 改成 scanf("%d ") 和 scanf("(%lf,%lf) ") 06/19 18:29
bibo9901: 然後 flush(stdin) 是 undefined behavior 06/19 18:31
還是沒辦法欸... 可是如果我其他的完全不動, 只把fflush拿掉 在把scanf第一個引數內的左括弧拿掉 scanf("%lf,%lf)",&num1,&num2); 這樣就會是正常的 不解...... ※ 編輯: sr29 (59.115.159.237), 06/19/2015 21:01:45
bibo9901: 我意思是scanf 第一個參數,結尾加一個空白 @@ 06/19 21:35
sr29: 恩 我有加過了 第二個scanf也是一樣 結果還是無法orz 06/19 21:43
easyget: http://pastie.org/10248921 06/19 23:10
easyget: 從 16 行開始,有變更 如果大大有什麼問題,再發信問我 06/19 23:11
johnhmj: 請參考 http://goo.gl/UBSrcP 06/20 00:50
yvb: 改成空白放前面, 也就是 scanf(" (%lf,%lf)",... 這樣呢? 06/20 16:27
easyget大大跟yvb大大的方法我都試過了 結果都有跑出預期的結果 真的不懂為啥orz 懇請各位開示 ( 從來沒遇過這種情形.... ) ※ 編輯: sr29 (59.115.159.237), 06/20/2015 16:47:35
LPH66: 問題在於大部份的 %xx 會先吃掉空白再讀, 但非 % 字元不會 06/20 17:14
LPH66: 所以 ( 就真的只吃 ( 不吃空白, 於是輸入之間的空白就卡住 06/20 17:15
LPH66: 而在格式字串裡放空白則是一個空白吃全部連續的空白 06/20 17:15
LPH66: 這樣就把輸入之間的空白給吃掉了 06/20 17:16
LPH66: 另外要注意的是 %xx 會停在它看不懂的第一個字 06/20 17:16
LPH66: 而且**不會先幫你吃掉空白**, 這對後讀的讀取會造成影響 06/20 17:17
LPH66: (以上我推文中的「空白」皆指 whitespace, 廣義的空白字元) 06/20 17:18
sr29: 了解了 感謝! 06/20 17:47
firejox: scanf("%*1[(]%lf%*1[,]%lf%*1[)]",..) ? 06/22 20:13
sr29: 有試過了 樓上那個好像也可以! 06/24 11:54