[爆卦]Scanf 錯誤是什麼?優點缺點精華區懶人包

為什麼這篇Scanf 錯誤鄉民發文收入到精華區:因為在Scanf 錯誤這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者monomorium (不再寫詩的詩人)看板C_and_CPP標題[問題] scanf 的奇怪問...





遇到的問題: 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)
bleed1979:如果有回傳值t,判斷t的值是否合理,問題就不存在? 07/31 15:32
bleed1979:以上例來說,t如果不為3,直接跳輸入錯誤,不管b。 07/31 15:33
monomorium:目前問題是宣告變數t,輸入b若非數字,會被代入0 07/31 15:34
bleed1979:可以改寫如下程式碼︰ 07/31 15:42
bleed1979:if(t == 3){ 07/31 15:42
monomorium:若是第一項輸入非數字,會直接顯示輸入錯誤的訊息 07/31 15:42
bleed1979: if (opt == '/' && b == 0) { 07/31 15:43
bleed1979: b = 1; 07/31 15:43
bleed1979: } 07/31 15:43
bleed1979:} 07/31 15:43
bleed1979:else 07/31 15:43
bleed1979: opt = '@'; // just diff form +, -, *, / 07/31 15:44
bleed1979:如果第一項非數字,t不會是3。 07/31 15:45
bleed1979:把opt改成default會跑得字元就可以造成輸入錯誤。 07/31 15:46
monomorium:感謝,我知道我測試時的問題出現在哪裡了 07/31 15:52
monomorium:本來有測試印出t,忘了把t帶進去,所以一直沒察覺 07/31 15:54

你可能也想看看

搜尋相關網站