[問題] int跟char一起宣告的Bug?

作者: allen20937 (旅行者)   2018-04-30 23:49:32
其實我不知道要怎麼下標題才好,因為我也不知道問題出在哪邊,我猜可能是記憶體的問
題,可是我第一次遇到這種問題,所以想問看看有沒有人知道,還請不吝回答,謝謝。
程式碼:
// 宣告部分
int Strength = 999;
int Agility = 999;
.
.
.
.
int tmp_Str;
int tmp_Agi;
char answer;
// 運作部分
.
.
.
.
.
tmp_Str = Strength;
tmp_Agi = Agility;
rewind(stdin);
_getch();
.
.
. (省略用printf畫圖的部分)
.
.
printf("1.攻擊 2.技能 3.逃跑(回合數:1 / 5)\n");
printf("tmp_Agi = %d", tmp_Agi);
printf("> ");
scanf("%s", &answer);
if (answer == '1')
{
printf("tmp_Agi = %d", tmp_Agi);
.
.
.
.
}
https://i.imgur.com/r6w9W8g.png (執行的結果圖)
發生的問題是當使用者輸入答案後,本來存在tmp_Agi裡面的數字會產生改變,可是我沒動
過這個變數,用單步執行也找不出問題來。不過如果在answer上面隨便宣告一個無用的int
變數,就可以避免這個問題發生,如下所示:
int tmp_Str;
int tmp_Agi;
int asdf;
char answer;
所以我猜大概是記憶體配置的問題,但實際上我也不太清楚,因為寫程式到現在第一次發
生這問題,所以還請知道答案的人可以告訴我,謝謝。
作者: Raymond0710 (雷門)   2018-04-30 23:54:00
scanf("%c", &answer)
作者: allen20937 (旅行者)   2018-05-01 00:06:00
感謝上面的回答,改成%c之後就正常了。可以請問一下為何輸入的類型是字元跟字串的差異會造成其他變數的改變嗎?
作者: FancyWing (TDiCS)   2018-05-01 00:14:00
&answer 是對位址做寫入,而不是變數%c 1 byte, %s >1 byte然後你兩個變數恰好是連續位置,寫入大於1Byte就覆蓋了是 pointer 常會遇到的狀況,所以請多小心
作者: allen20937 (旅行者)   2018-05-01 07:33:00
謝謝上面的回答,又學到東西了
作者: cphe (魔鬼藏在垃圾筒裡)   2018-05-02 01:30:00
可以想像你儲存一個'1'跟"1"在記憶體裡實際的差異,如上面所說直接用位址操作超出預期範圍就有可能踩到其他東西(相鄰位址的資料),嚴重的話ap可能直接crash。c的字串操作其實很麻煩,要算很精準,也就是要非常小心

Links booklink

Contact Us: admin [ a t ] ucptt.com