Strcpy更改struct int数组

时间:2017-04-09 02:36:10

标签: c arrays struct strcpy

我在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数组,而不是以前的结构。

2 个答案:

答案 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错误事件。

相关问题