[问题] 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