c - Strcpy 改变 struct int 数组

标签 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 数组,而不是之前的结构中的任何其他内容。

最佳答案

结构元素 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);

关于c - Strcpy 改变 struct int 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43302443/

相关文章:

具有动态大小的 Python C 扩展类

python - 将文件加载到 2d numpy 数组中的有效方法

C 编程 - 验证 int 输入使其不是字符

c - 一种更好的大数相加方法,Project Euler #13

javascript - 如何连接两个数组并以相同的方式部署它们但使用字符串值?

c - 使用指针传递结构数组并返回结构数组 - 函数

c++ - 迭代结构列表

c - 结构体首地址

c - 错误的 Malloc() 三层结构?

c - OpenMP:首先完成第一次迭代