我正在使用C读取CSV文件,并希望将strtok()中的标记存储在数组中。不知何故,当CSV文件有多行时,我无法获得令牌的正确输出。 CSV文件看起来像这样(此示例只需两行,真实文件将有超过100行):
abc,def,ghi
jkl,mno
我的代码是:
void main() {
FILE *fp;
fp = fopen("simple.csv", "r");
const char s[2] = ",";
char *token;
char *out[5];
int i = 0;
if (fp != NULL)
{
char line[50];
while (fgets(line, sizeof line, fp) != NULL)
{
token = strtok(line, s);
//for (token; token != NULL; token = strtok(NULL, ","))
while (token != NULL)
{
out[i++] = token;
//printf("%s", token);
token = strtok(NULL, s);
}
printf("%s\n", out[0]);
}
//for (i = 0; i < 5; i++)
fclose(fp);
}
else {
printf("error opening file");
}
}
我希望每个逗号分隔的字符串都通过循环存储在数组中。
当我打印出数组的第一个元素(out[0]
)时,输出为:
abc
jkl
虽然我希望它只是令牌:
ABC
有谁能告诉我这是什么问题?
答案 0 :(得分:1)
问题是strtok
返回指向line
多个地方的指针,其内容一直在变化。
因此,您需要复制令牌的内容,而不仅仅是指定指针。
例如,将out
定义为:
char out[5][10]; // max of 5 words, each of 10 chars max (including \0)
并在循环内部:
strcpy(&out[i++][0], token);