[問題] scanf 的奇怪問題

看板C_and_CPP (C/C++)作者 (不再寫詩的詩人)時間15年前 (2010/07/31 14:57), 編輯推噓0(0016)
留言16則, 2人參與, 最新討論串1/1
遇到的問題: C 語言 scanf() 的問題 希望得到的正確結果: 錯誤發生 程式跑出來的錯誤結果: 錯誤沒有發生 測試平台: Mac - GCC 4.0.1 Windows XP - Dev-C++ 有問題的code: #include <stdio.h> int main(void) { //int a, b; //宣告需要用到的變數 int a, b, t; //宣告需要用到的變數 char opt; printf("這個程式會依符號計算兩個整數的和、差、積、商....\n"); printf("請輸入計算式,如 2+2: "); //提示使用者輸入的文字 scanf("%d %c %d", &a, &opt, &b); //t = scanf("%d %c %d", &a, &opt, &b); //printf("t = %d\n"); //如果使用者輸入的除數為 0 ,將除數改為 1 if (opt == '/' && b == 0) { b = 1; } //以下會依運算子計算並印出結果 printf("結果如下: \n"); switch (opt) { case '+': printf("%d + %d = %d\n", a, b, a + b); break; case '-': printf("%d - %d = %d\n", a, b, a - b); break; case '*': printf("%d * %d = %d\n", a, b, a * b); break; case '/': printf("%d / %d = %d\n", a, b, a / b); break; default: printf("輸入錯誤!\n"); break; } return 0; } 補充說明: Mac 底下編譯,結果舉例 $ ./calculator4 這個程式會依符號計算兩個整數的和、差、積、商.... 請輸入計算式,如 2+2: 3-3 結果如下: 3 - 3 = 0 $ ./calculator4 這個程式會依符號計算兩個整數的和、差、積、商.... 請輸入計算式,如 2+2: ooo 結果如下: 輸入錯誤! $ ./calculator4 這個程式會依符號計算兩個整數的和、差、積、商.... 請輸入計算式,如 2+2: o-9 結果如下: 輸入錯誤! $ ./calculator4 這個程式會依符號計算兩個整數的和、差、積、商.... 請輸入計算式,如 2+2: 9-o 結果如下: 9 - 0 = 9 $ 若是將程式多宣告的變數 t 刪除 也就是採用註解化的那一行宣告 最後一項測試 9-o 才會出現不正常的整數 Windows XP 底下用 Dev-C++ 編譯 則是不管有沒有多宣告變數 t 輸入 b 的時候用任意非整數的字符代替 b 的值都會是 53 基本上這是小弟寫 C 語言教材準備拿來當範例的程式 原本預期錯誤會發生,然後加入錯誤防範的機制 變數 t 原要用為接收 scanf() 的回傳值 現在多一個變數 t ,居然把不正確的 b 直接歸零 小弟寫程式資歷尚淺,不解何故,盼高手指教 文章稍長,謝謝各位耐心閱讀,感激不盡! -- 程式語言:教學誌 http://pydoing.blogspot.com/ C 語言教材 http://pydoing.blogspot.com/p/c-tutorial.html Python 教材 http://pydoing.blogspot.com/2008/09/blog-post.html -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.169.141.42 ※ 編輯: monomorium 來自: 118.169.141.42 (07/31 14:59)

07/31 15:32, , 1F
如果有回傳值t,判斷t的值是否合理,問題就不存在?
07/31 15:32, 1F

07/31 15:33, , 2F
以上例來說,t如果不為3,直接跳輸入錯誤,不管b。
07/31 15:33, 2F

07/31 15:34, , 3F
目前問題是宣告變數t,輸入b若非數字,會被代入0
07/31 15:34, 3F

07/31 15:42, , 4F
可以改寫如下程式碼︰
07/31 15:42, 4F

07/31 15:42, , 5F
if(t == 3){
07/31 15:42, 5F

07/31 15:42, , 6F
若是第一項輸入非數字,會直接顯示輸入錯誤的訊息
07/31 15:42, 6F

07/31 15:43, , 7F
if (opt == '/' && b == 0) {
07/31 15:43, 7F

07/31 15:43, , 8F
b = 1;
07/31 15:43, 8F

07/31 15:43, , 9F
}
07/31 15:43, 9F

07/31 15:43, , 10F
}
07/31 15:43, 10F

07/31 15:43, , 11F
else
07/31 15:43, 11F

07/31 15:44, , 12F
opt = '@'; // just diff form +, -, *, /
07/31 15:44, 12F

07/31 15:45, , 13F
如果第一項非數字,t不會是3。
07/31 15:45, 13F

07/31 15:46, , 14F
把opt改成default會跑得字元就可以造成輸入錯誤。
07/31 15:46, 14F

07/31 15:52, , 15F
感謝,我知道我測試時的問題出現在哪裡了
07/31 15:52, 15F

07/31 15:54, , 16F
本來有測試印出t,忘了把t帶進去,所以一直沒察覺
07/31 15:54, 16F
文章代碼(AID): #1CKyb8pf (C_and_CPP)
文章代碼(AID): #1CKyb8pf (C_and_CPP)