打印结构体字段只打印最后一个元素多次- C



我有一个结构体:

typedef struct fileRep
{
    char *fileName;
    int index;
    int visited;
} fileRep;

我的main函数调用了一个函数,该函数创建了一个struct filRep数组:

fileRep  *allFiles = (fileRep*)malloc(MAX_LINES*sizeof(fileRep));
int i = linesToStruct(allFiles, fp);

功能如下:

int linesToStruct(fileRep* allFiles, FILE* fp)
{
char line[MAX_CHARS_LINE];
int i = 0;
while(fgets(line, sizeof line, fp))
{
    fileRep file1 = createBasicFileStruct(line, i);
    allFiles[i] = file1;
    printf("%s is addedn", allFiles[i]);
    i++;
}
return i;
}

调用这个函数:

fileRep createBasicFileStruct(char *line, int lineNumber)
{
char* name;
fileRep file1;
name = strtok(line, ":" );
file1.fileName = name;
file1.index = lineNumber;
file1.visited = 0;
return file1;
}

现在我尝试迭代并打印我创建的每个fileRep结构体的fileName字段:

int k = 0;
for(; k < i; k++)
{
    printf("File %d is %sn", k, allFiles[k].fileName);
}

这会导致这样的打印:

File 0 is file4
File 1 is file4
File 2 is file4
File 3 is file4
函数lineToStruct有一个内部测试打印,它打印:
file1.h is added
file2.h is added
file3.h is added
file4.h is added

意味着它添加了文件。

我是新的C和我有困难获得指针和数组的相关性,为什么allFiles[0]是NULL?我如何设置它迭代正确?

line的内容在linesToStruct函数中fgets的每次迭代中被替换,您可以传递字符串的副本(您可以使用strdup(line))而不是line

或者更好(如@alk所建议的),传递line,然后在createBasicFileStruct中复制标记化的字符串,如果你不需要其余的令牌:

name = strtok(line, ":" );
file1.fileName = strdup(name);

这样你需要更少的空间。

不要忘记在末尾对所有字符串进行free

此处:

int k = 0;
for(; k < i; k++)
{
    printf("File %d is %sn", k, allFiles[i].fileName);
}

应该是:

int k = 0;
for(; k < i; k++)
{
    printf("File %d is %sn", k, allFiles[k].fileName);
}

? ?

最新更新