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

时间:2016-08-13 11:02:48

标签: c arrays struct

我有一个结构:

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 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结构的fileName字段:

int k = 0;
for(; k < i; k++)
{
    printf("File %d is %s\n", 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?如何将其设置为正确迭代?

2 个答案:

答案 0 :(得分:1)

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

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

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

这样你就需要更少的空间。

不要忘记free最后的所有字符串。

答案 1 :(得分:0)

下面:

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

不应该这样:

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

...