我在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数组,而不是以前的结构。
答案 0 :(得分:2)
结构元素 int shell [SHELLS];
的索引范围为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]将超出范围,导致未定义的行为。 你看到的那些数字恰好是那些超出范围内存空间的数字。
我想你想做点什么:
int iShellCnt = 0;
for(int k=5;k<SHELLS+5;k++)
elements[i].shell[iShellCnt++] = (int) strtol(array[k], NULL, 10);
答案 1 :(得分:0)
BTW:SHELLS定义为什么?
以下是问题的根源:
代码块以:
开头for(int k=5;k<SHELLS+5;k++)
将第一个条目放在
中elements[i].shell[5]
并继续放置数据,直到shell []数组结束很久,这个结果是未定义的行为,可能/将导致seg错误事件。