0

我是 C 新手,但几周前我已经用 pascal 编程过。在 pascal 中,如果要更改数组数据,则通过引用传递,var myArray本质上是键入。我不知道如何在 C 中做到这一点。我读过很多问题,但似乎都没有。这是我到目前为止所拥有的。

void set_up_elements(char (*array_to_populate)[20])
{
    char* buffer;
    FILE *f;
    f=fopen("elementList.txt","r");
    char copied_text[118][20];
    int i=0;
    while (!feof(f))
    {
        fgets(copied_text[i],80,f);
        ++i;
    }
    //Close the file to free up memory and prevent leaks
    fclose(f);
    f = NULL;
}

这是我填充数组的代码,我将元素周期表中的元素列表读入数组copied_text。这部分有效,它成功填充了函数内部的数组。

int main()
{
    char element_array[118][20];
    set_up_elements(element_array);
<..>
}

这就是我试图称呼它的方式。数组的内容element_array不会改变。有谁知道如何解决这一问题?谢谢。

4

3 回答 3

3

1)以下行是错误的

fgets(copied_text[i],80,f);

字符串数组中一个元素字符串的大小为20. 你把最大的字符放在你的fgets()函数中是80

所以将其更改为:

fgets(copied_text[i],sizeof(copied_text[0]),f);

2)您可以更改此代码:

while (!feof(f))
    {
        fgets(copied_text[i],80,f);
        ++i;
    }

while (i<118 && fgets(copied_text[i++],80,f));

3)你的函数的输入参数

void set_up_elements(char (*array_to_populate)[20])

未在您的函数中使用。似乎您想将其填充到您的函数中,但事实并非如此,您正在使用调用者看不到的另一个数组(本地数组)

于 2013-04-24T16:14:25.023 回答
1

应用左右阅读规则来理解问题......

char element_array[118][20]表示 element_array 是 118 个 20 个字符的块的数组。

另一方面,char (*array_to_populate)[20]由于括号,array_to_populate 是一个指向 20 个字符数组的指针。

您可以使用char (&array_to_populate)[118][20]这意味着 array_to_populate 是对 118 个 20 个字符的块的引用。

也就是说,最大的问题是在您的函数中,您正在读取一个临时数组,而您永远不会复制到传入的数组中。此外,您读取的文件大小错误。以下应该完成工作......

#define DIM1 118
#define DIM2 20

void set_up_elements(char (&array_to_populate)[DIM1][DIM2])
{
    int i=0;
    FILE *f=fopen("elementList.txt","r");

    for (i = 0; f && !feof(f) && i < DIM1; i++ )
    {
        fgets(array_to_populate[i],sizeof(array_to_populate[0]),f);
    }

    //Close the file to free up memory and prevent leaks
    fclose(f);
}
于 2013-04-24T16:16:48.157 回答
1
void set_up_elements(char (*array_to_populate)[20])
{
    char* buffer;//unuse var
    FILE *f;
    f=fopen("elementList.txt","r");
    int i=0;
    while (!feof(f))//caution
    {
        fgets(&(*array_to_populate[i]),20,f);
        ++i;
    }
    //Close the file to free up memory and prevent leaks
    fclose(f);
    f = NULL;
}
于 2013-04-24T16:25:41.213 回答