typedef struct {
long f1;
char f2[FIELD2_STRING_LENGTH];
char* f3;
} bankRecord;
while (fgets(line, 1000, file)) {
record *rptr = malloc(sizeof(record));
char *token = strtok(line, ",");
rptr->f1 = atol(token); // works fine
strcpy(rptr->f2,strtok(NULL, ",")) // works fine
rptr->f3 = strtok(NULL, ","); // fails, at the end, all records have the same data in f3, if strcpy is used - causes segmentation fault
records[i++] = record;
}
该代码是从csv文件读取器方法中提取的。csv文件的格式为"long integer, fixed Character string, variable Character String"
。records
是指向记录对象的指针数组(类型为record **
(。在while循环结束时,所有记录似乎都具有相同的f3值(最后添加的一个(,同时存储f1和f2的正确值。我不知道是什么原因造成的,因为f2和f3都是字符串。将f3的赋值从"="导致分段错误。
br->f3 = strtok(NULL, ",");
设置一个指向strtok内部的指针。它不会复制字符串。基本上,你所有的f3指针都指向同一个位置。
你需要
br->f3 = strdup(strtok(NULL, ","));
以在该点制作字符串的副本。您稍后需要释放内存