c-strcpy,从strtok到可变长度结构字符串的赋值


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, ",")); 

以在该点制作字符串的副本。您稍后需要释放内存

最新更新