我有一个结构体:
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);
}
? ?