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

看板C_and_CPP作者 (旅行者)時間6年前 (2018/04/30 23:49), 6年前編輯推噓2(2011)
留言13則, 4人參與, 6年前最新討論串1/1
其實我不知道要怎麼下標題才好,因為我也不知道問題出在哪邊,我猜可能是記憶體的問 題,可是我第一次遇到這種問題,所以想問看看有沒有人知道,還請不吝回答,謝謝。 程式碼: // 宣告部分 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; 所以我猜大概是記憶體配置的問題,但實際上我也不太清楚,因為寫程式到現在第一次發 生這問題,所以還請知道答案的人可以告訴我,謝謝。 -- 廚廚復廚廚,木蘭中路廚;不聞支援聲,唯見三嘆息; 問女何冥門,問女何坦營,前線有冥門,據點有坦營。 昨夜軍管區,文賓大點兵;國任十二場;場場對AT; 前線無防滿,隊友無鑲嵌;願為M盾戰,從此發佛心。 東路被放生,西路被蓋傷,南路被集火,北路被肛肛。 ~選自卡薩多民歌《木蘭詩》 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 182.158.76.133 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1525103380.A.7F0.html ※ 編輯: allen20937 (182.158.76.133), 04/30/2018 23:50:47 ※ 編輯: allen20937 (182.158.76.133), 04/30/2018 23:51:07

04/30 23:54, 6年前 , 1F
scanf("%c", &answer)
04/30 23:54, 1F
※ 編輯: allen20937 (182.158.76.133), 05/01/2018 00:01:57

05/01 00:06, 6年前 , 2F
感謝上面的回答,改成%c之後就正常了。
05/01 00:06, 2F

05/01 00:07, 6年前 , 3F
可以請問一下為何輸入的類型是字元跟字串的差異會造成
05/01 00:07, 3F

05/01 00:08, 6年前 , 4F
其他變數的改變嗎?
05/01 00:08, 4F

05/01 00:14, 6年前 , 5F
&answer 是對位址做寫入,而不是變數
05/01 00:14, 5F

05/01 00:15, 6年前 , 6F
%c 1 byte, %s >1 byte
05/01 00:15, 6F

05/01 00:17, 6年前 , 7F
然後你兩個變數恰好是連續位置,寫入大於1Byte就覆蓋了
05/01 00:17, 7F

05/01 00:19, 6年前 , 8F
是 pointer 常會遇到的狀況,所以請多小心
05/01 00:19, 8F

05/01 07:33, 6年前 , 9F
謝謝上面的回答,又學到東西了
05/01 07:33, 9F

05/02 01:30, 6年前 , 10F
可以想像你儲存一個'1'跟"1"在記憶體裡實際的差異,如上面
05/02 01:30, 10F

05/02 01:30, 6年前 , 11F
所說直接用位址操作超出預期範圍就有可能踩到其他東西(相鄰
05/02 01:30, 11F

05/02 01:30, 6年前 , 12F
位址的資料),嚴重的話ap可能直接crash。c的字串操作其實
05/02 01:30, 12F

05/02 01:30, 6年前 , 13F
很麻煩,要算很精準,也就是要非常小心
05/02 01:30, 13F
文章代碼(AID): #1QvpiKVm (C_and_CPP)