看板 C_and_CPP 關於我們 聯絡資訊
其實我不知道要怎麼下標題才好,因為我也不知道問題出在哪邊,我猜可能是記憶體的問 題,可是我第一次遇到這種問題,所以想問看看有沒有人知道,還請不吝回答,謝謝。 程式碼: // 宣告部分 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
Raymond0710: scanf("%c", &answer) 04/30 23:54
※ 編輯: allen20937 (182.158.76.133), 05/01/2018 00:01:57
allen20937: 感謝上面的回答,改成%c之後就正常了。 05/01 00:06
allen20937: 可以請問一下為何輸入的類型是字元跟字串的差異會造成 05/01 00:07
allen20937: 其他變數的改變嗎? 05/01 00:08
FancyWing: &answer 是對位址做寫入,而不是變數 05/01 00:14
FancyWing: %c 1 byte, %s >1 byte 05/01 00:15
FancyWing: 然後你兩個變數恰好是連續位置,寫入大於1Byte就覆蓋了 05/01 00:17
FancyWing: 是 pointer 常會遇到的狀況,所以請多小心 05/01 00:19
allen20937: 謝謝上面的回答,又學到東西了 05/01 07:33
cphe: 可以想像你儲存一個'1'跟"1"在記憶體裡實際的差異,如上面 05/02 01:30
cphe: 所說直接用位址操作超出預期範圍就有可能踩到其他東西(相鄰 05/02 01:30
cphe: 位址的資料),嚴重的話ap可能直接crash。c的字串操作其實 05/02 01:30
cphe: 很麻煩,要算很精準,也就是要非常小心 05/02 01:30