我有一个结构:
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?如何将其设置为正确迭代?
答案 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);
}
...