返回信息流各位大牛,我的C语言程序中,有一段代码是要连续读入两个变量,起先我都是用%d往里读,没有任何问题。后来为了添加容错功能,改为了用%s往里读。结果修改之后,若是给第二个变量赋值超过两位的话,就会挤掉第一个变量的值。是存储空间不够么?两个变量相互之间怎么还会影响呢?亟盼各位大牛不吝指点。。。。。。
这是一条镜像帖。来源:北邮人论坛 / cpp / #30122同步于 2009/10/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[求助]弱问C语言一变量赋值问题
lixians
2009/10/21镜像同步12 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
上代码
你所说的%s读是怎么读?读到str里再处理?
【 在 lixians (5he) 的大作中提到: 】
: 各位大牛,我的C语言程序中,有一段代码是要连续读入两个变量,起先我都是用%d往里读,没有任何问题。后来为了添加容错功能,改为了用%s往里读。结果修改之后,若是给第二个变量赋值超过两位的话,就会挤掉第一个变量的值。是存储空间不够么?两个变量相互之间怎么还会�
就是“dig_new”和“cha_new”这两个变量,cha_new会挤掉dig_new的值
===============================================
else if(strcmp(choice1,"3")==0)
{
printf("\n The default values are: digital = 4, chance = 8.\n");
printf("\n The current values are: digital = %d, chance = %d.\n",digital,chance);
printf("\n\n Please input the new values:\n");
back4:
printf("\n digital = ");
scanf("%s",dig_new);
flag=0;
if(strlen(dig_new)>1){if(strcmp(dig_new,"10")!=0)flag=1;}
else if(dig_new[0]-'0'<=0||dig_new[0]-'0'>9) flag=1;
if(flag==1)
{
printf("\nSorry, the range should be from 1 to 10.");
printf(" Try again please.\n\n\a");
goto back4;
}
back5:
printf("\n chance = ");
scanf("%s",cha_new);
flag=0;
for(int n=0; n<strlen(cha_new); n++)
if(cha_new[n]-'0'<0 || cha_new[n]-'0'>9){flag=1;break;}
if(flag==0)
{
chance_new=0;
for(int o=0; o<strlen(cha_new); o++)
chance_new+=pow(10,o)*(cha_new[strlen(cha_new)-1-o]-'0');
}
if(chance_new<0||flag==1)
{
printf("\nSorry, you should input an integer.");
printf(" Try again please.\n\n\a");
goto back5;
}
程序起始处的变量声明如下:
char check[2],dig_new[2],cha_new[2],input[10],choice1[2]="1",choice2[2]="1";
【 在 lixians 的大作中提到: 】
: 程序起始处的变量声明如下:
: char check[2],dig_new[2],cha_new[2],input[10],choice1[2]="1",choice2[2]="1";
这个情况当然会出现了,数组越界溢出了啊。。。覆盖掉了
也就是说如果把第二个变量改为cha_new[3],输入2位数就没问题了是么?
但它为什么不往后继续存储,而是要覆盖前面的值呢?
【 在 jmpesp 的大作中提到: 】
: 这个情况当然会出现了,数组越界溢出了啊。。。覆盖掉了
【 在 lixians 的大作中提到: 】
: 也就是说如果把第二个变量改为cha_new[3],输入2位数就没问题了是么?
: 但它为什么不往后继续存储,而是要覆盖前面的值呢?
恩,没问题
【 在 lixians 的大作中提到: 】
: 也就是说如果把第二个变量改为cha_new[3],输入2位数就没问题了是么?
: 但它为什么不往后继续存储,而是要覆盖前面的值呢?
这是栈的分配情况,如果你熟悉汇编就会很明白了
一般局部变量都是这样分配
push ebp
mov easp, esp
sub esp, 局部变量的总共大小
然后引用某个局部变量就这样引用
[ebp - 局部变量位置]