Printing struct字段只打印最后一个元素多次-C

Printing struct字段只打印最后一个元素多次-C,c,arrays,struct,C,Arrays,Struct,我有一个结构: typedef struct fileRep { char *fileName; int index; int visited; } fileRep; My main函数对创建struct filRep数组的函数进行了以下调用: fileRep *allFiles = (fileRep*)malloc(MAX_LINES*sizeof(fileRep)); int i = linesToStruct(allFiles, fp); 这就是功能: in

我有一个结构:

typedef struct fileRep
{
    char *fileName;

    int index;
    int visited;
} fileRep;
My 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 added\n", 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;
}
它调用此函数:

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 added\n", 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结构的文件名字段:

int k = 0;
for(; k < i; k++)
{
    printf("File %d is %s\n", k, allFiles[k].fileName);
}
现在只需了解更多信息:函数lineToStruct有一个内部测试打印,它打印:

file1.h is added
file2.h is added
file3.h is added
file4.h is added
这意味着它确实添加了文件

我是C新手,在获取指针和数组相关性时遇到了问题, 为什么所有文件[0]都为空?如何将其设置为正确迭代?

此处:

int k = 0;
for(; k < i; k++)
{
    printf("File %d is %s\n", k, allFiles[i].fileName);
}
intk=0;
对于(;k
这不应该是:

int k = 0;
for(; k < i; k++)
{
    printf("File %d is %s\n", k, allFiles[k].fileName);
}
intk=0;
对于(;k

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

或者更好(如@alk所建议的),传递
,然后在
createBasicFileStruct
内复制标记化字符串,如果您不需要剩余的标记:

name = strtok(line, ":" );
file1.fileName = strdup(name);
这样你需要更少的空间


不要忘了在末尾释放所有这些字符串。

现在让我们假设函数linesToStruct可以很好地归档所有文件。它返回i,i是它添加的元素数。我们不能假设没有看到代码;)编辑了我的问题很好,现在请向我们展示
createBasicFileStruct
函数LOL;)您将字符串分配给成员
filename
?这个
allFiles[i].filename)
不应该是
allFiles[k].filename)
?啊,常见的
strtok())
陷阱,我在阅读“…只打印最后一个元素…”时已经闻到了:-,谢谢,我已经编辑了这个问题,这是一个打字错误,但它也不能解决问题,它仍然只打印最后一个文件多次我没有看到内存泄漏。事实上,我甚至没有看到任何
[m/c/re]alloc()
。请注意我在函数linesToStruct中的打印,它确实显示它在每次迭代中都会得到一个新名称。@EF:
fileRep*allFiles=(fileRep*)malloc(MAX_LINES*sizeof(fileRep))@AlterMann谢谢,你是(alter的)人@Eyzuky,你有一个编辑