当我尝试浏览文件时,它会覆盖我想要保存的数组吗?

Tob*_*in2 0 c file

    char * names[10];
    int i = 0;
    char theRow[20];

    while (fgets(theRow, 80 , fp) != NULL) {
        names[i] = theRow;
        i++;
    }
Run Code Online (Sandbox Code Playgroud)

我试图保存的数组的输出完全相同,具体取决于最后一个元素.

对于前 文件具有(hi,I,2,3,karl)
阵列然后变成(karl,karl,karl,karl,karl)

我错过了什么或者它能做什么?

Ste*_*ner 5

有了names[i] = nameRow;,你一次又一次地存储相同的指针(到同一个内存块),但是对于你读过的每一行,如果这一块内存都会覆盖内容.

您需要将读入的内容复制到缓冲区中nameRow,然后再覆盖它,然后再循环下一次迭代.

names[i] = strdup(nameRow);
Run Code Online (Sandbox Code Playgroud)

函数strdup做两件事,(1)它保留足够大的内存来保存nameRow(使用malloc)的副本,(2)然后复制内容.

这也清楚地表明您将需要free稍后复制每个条目.

并且,虽然被广泛采用,但strdup不是标准C的一部分; 所以为了独立于平台,你必须写...

names[i] = malloc(strlen(nameRow)+1);
strcpy(names[i],nameRow);
Run Code Online (Sandbox Code Playgroud)