strcpy 改变 struct int 数组
Strcpy changing struct int array
我在 C 中有一个结构,我创建了这个结构的数组
typedef struct {
int aNum;
char name[20];
char sym[10];
char class[30];
float weight;
int shell[SHELLS];
} element_t;
element_t elements[MAX_ELEMENTS];
我要求用户输入 (1 Hydrogen H other_nonmetals 1.008 1 0 0 0 0 0 0
),我根据空格将其分成一个数组。
我通过调用函数获取每个用户输入,
for(int i=0;i<N;i++)
scan_element(i);
函数:
void scan_element(int i) {
char *array[12];
char str[100];
int j=0;
if (fgets(str, 100, stdin)) {
array[j] = strtok(str," ");
while(array[j]!=NULL)
{
array[++j] = strtok(NULL," ");
}
}
elements[i].aNum = (int) strtol(array[0], NULL, 10);
if(i>0)
for(int k=5;k<SHELLS+5;k++)
printf("%d ",elements[i-1].shell[k]);
printf("\n");
strcpy(elements[i].name, array[1]);
strcpy(elements[i].sym, array[2]);
strcpy(elements[i].class, array[3]);
elements[i].weight = (strtod(array[4],NULL));
for(int k=5;k<SHELLS+5;k++)
elements[i].shell[k] = (int) strtol(array[k], NULL, 10);
}
如果我只输入 1 个元素,shell int 数组没问题,但是当我输入另一个元素时,它会弄乱前一个元素的 shell 数组。它应该看起来像 1 0 0 0 0 0 0
,并且它适用于当前元素,但是当我输入另一个元素时,shell 数组看起来像 1 0 82 1684104524 0 0 0
。我想它是在我调用 strcpy
之后发生的,就像之前它打印出来的一样好,但是在我第一次调用 strcpy
之后,它会向数组添加随机数。
如何修复它以便我可以输入多个元素而不会弄乱前一个元素的 shell 数组?它只会弄乱 shell 数组,之前的结构没有别的。
结构元素
int shell[贝壳];
索引范围从 0 到 (SHELLS-1)。
所以 shell[0] .. shell[SHELLS-1] 是有效的。
以下赋值是越界赋值:
for(int k=5;k<SHELLS+5;k++)
elements[i].shell[k] = (int) strtol(array[k], NULL, 10);
shell[SHELLS]、shell[SHELLS+1]、shell[SHELLS+2]、shell[SHELLS+3] 和 shell[SHELLS+4] 将越界导致未定义的行为。
你看到的那些数字恰好是那些超出内存限制的数字space.
我想你想做这样的事情:
int iShellCnt = 0;
for(int k=5;k<SHELLS+5;k++)
elements[i].shell[iShellCnt++] = (int) strtol(array[k], NULL, 10);
顺便说一句:SHELLS 的定义是什么?
问题的根源如下:
代码块开头为:
for(int k=5;k<SHELLS+5;k++)
将第一个条目放入
elements[i].shell[5]
并继续放置数据,直到远远超过 shell[] 数组的末尾,此结果是未定义的行为并且 can/will 导致段错误事件。
我在 C 中有一个结构,我创建了这个结构的数组
typedef struct {
int aNum;
char name[20];
char sym[10];
char class[30];
float weight;
int shell[SHELLS];
} element_t;
element_t elements[MAX_ELEMENTS];
我要求用户输入 (1 Hydrogen H other_nonmetals 1.008 1 0 0 0 0 0 0
),我根据空格将其分成一个数组。
我通过调用函数获取每个用户输入,
for(int i=0;i<N;i++)
scan_element(i);
函数:
void scan_element(int i) {
char *array[12];
char str[100];
int j=0;
if (fgets(str, 100, stdin)) {
array[j] = strtok(str," ");
while(array[j]!=NULL)
{
array[++j] = strtok(NULL," ");
}
}
elements[i].aNum = (int) strtol(array[0], NULL, 10);
if(i>0)
for(int k=5;k<SHELLS+5;k++)
printf("%d ",elements[i-1].shell[k]);
printf("\n");
strcpy(elements[i].name, array[1]);
strcpy(elements[i].sym, array[2]);
strcpy(elements[i].class, array[3]);
elements[i].weight = (strtod(array[4],NULL));
for(int k=5;k<SHELLS+5;k++)
elements[i].shell[k] = (int) strtol(array[k], NULL, 10);
}
如果我只输入 1 个元素,shell int 数组没问题,但是当我输入另一个元素时,它会弄乱前一个元素的 shell 数组。它应该看起来像 1 0 0 0 0 0 0
,并且它适用于当前元素,但是当我输入另一个元素时,shell 数组看起来像 1 0 82 1684104524 0 0 0
。我想它是在我调用 strcpy
之后发生的,就像之前它打印出来的一样好,但是在我第一次调用 strcpy
之后,它会向数组添加随机数。
如何修复它以便我可以输入多个元素而不会弄乱前一个元素的 shell 数组?它只会弄乱 shell 数组,之前的结构没有别的。
结构元素 int shell[贝壳];
索引范围从 0 到 (SHELLS-1)。
所以 shell[0] .. shell[SHELLS-1] 是有效的。
以下赋值是越界赋值:
for(int k=5;k<SHELLS+5;k++)
elements[i].shell[k] = (int) strtol(array[k], NULL, 10);
shell[SHELLS]、shell[SHELLS+1]、shell[SHELLS+2]、shell[SHELLS+3] 和 shell[SHELLS+4] 将越界导致未定义的行为。 你看到的那些数字恰好是那些超出内存限制的数字space.
我想你想做这样的事情:
int iShellCnt = 0;
for(int k=5;k<SHELLS+5;k++)
elements[i].shell[iShellCnt++] = (int) strtol(array[k], NULL, 10);
顺便说一句:SHELLS 的定义是什么?
问题的根源如下:
代码块开头为:
for(int k=5;k<SHELLS+5;k++)
将第一个条目放入
elements[i].shell[5]
并继续放置数据,直到远远超过 shell[] 数组的末尾,此结果是未定义的行为并且 can/will 导致段错误事件。