#include <stdio.h>
int main () {
int vIn_a, vIn_b, vIn_c;
char vOperator;
printf("Please enter a number\n");
scanf("%d", vIn_a);
printf("Please enter a number\n");
scanf("%d", vIn_b);
printf("Please enter a Operator\n");
scanf("%c", vOperator);
switch(vOperator){
case ' ':
vIn_c = (vIn_a vIn_b);
break;
case '-':
vIn_c = (vIn_a - vIn_b);
break;
case '/':
vIn_c = (vIn_a / vIn_b);
break;
case '*':
vIn_c = (vIn_a * vIn_b);
break;
}
printf("Result: %d %c %d = %d", vIn_a, vOperator, vIn_b, vIn_c);
return 0;
}
只是想弄清楚這一點,我運行了 gdb。但不確定我的除錯器此時告訴我什么。也許我忽略了它?除錯器:程式收到信號 SIGSEGV,分段錯誤。0x00007ffff7c60d36 在?? () 來自 /usr/lib/libc.so.6
那么是什么導致了這種分段錯誤呢?我正在學習 C,但我迷路了。
提前致謝。
uj5u.com熱心網友回復:
使用 時scanf(),您不會傳遞要存盤值的變數,而是傳遞指向變數的指標。
因此,例如,scanf("%d", vIn_a);您需要代替 ,scanf("%d", &vIn_a);注意 ' &'!
正如您撰寫的那樣,呼叫的效果是scanf()將任意數字(無論未初始化的vIn_aand中的隨機內容是什么)傳遞vIn_b給scanf(). 它將那些隨機(ish)整數值視為指標。因此,當它將用戶貢獻的值寫入已傳遞的“指標”中時,它具有以下效果:
*(int *)vIn_a = user_entered_value;
如果您了解指標的方法,您就會知道這是災難的根源!
還有兩個陷阱:
您的 '
/' 運算子不會檢查其除數 (vIn_b) 是否為零,因此如果用戶為運算子選擇零vIn_b并為運算子選擇 '/',則很容易因被零除錯誤而崩潰。您的陳述句中沒有
default:子句switch,因此如果用戶鍵入的內容不是您要檢查的運算子字符,vIn_c則將包含隨機垃圾,因為它在列印時尚未初始化。
uj5u.com熱心網友回復:
您可以將 scanf 函式與 & 一起使用。例如;scanf("%d", &vIn_a);
對于檔案:https ://cplusplus.com/reference/cstdio/scanf/
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/494769.html
