我正在读一个.csv文件(用逗号分隔),所以我可以分析数据。许多字段都为null,这意味着一行可能如下所示:
456,Delaware,14450,,,John,Smith
(我们没有John Smith的电话号码或电子邮件地址,因此这些字段为空)。
但是当我尝试将这些行分成标记时(因此我可以将它们放在矩阵中来分析数据),strtok不会返回NULL或空字符串,而是会跳过这些字段而最终会出现不匹配列。
换句话说,我想要的结果是:
a[0]=456
a[1]=Delaware
a[2]=14450
a[3]=NULL (or "", either is fine with me)
a[4]=NULL (or "")
a[5]=John
a[6]=Smith
相反,我得到的结果是:
a[0]=456
a[1]=Delaware
a[2]=14450
a[3]=John
a[4]=Smith
哪个错了。关于如何获得我需要的结果的任何建议都将受到欢迎。这是我的代码:
FILE* stream = fopen("filename.csv", "r");
i=0;
char* tmp;
char* field;
char line[1024];
while (fgets(line, 1024, stream))
{
j=0;
tmp = strdup(line);
field= strtok(tmp, ",");
while(field != NULL)
{
a[i][j] =field;
field = strtok(NULL, ",");
j++;
}
i++;
}
fclose(stream);
答案 0 :(得分:0)
引自ISO / IEC 9899:TC3 7.21.5.8 strtok函数
3序列中的第一个调用将搜索s1指向的字符串作为第一个字符 它不包含在s2指向的当前分隔符字符串中。如果没有这样的角色 找到,然后s1和strtok函数指向的字符串中没有标记 返回一个空指针。如果找到这样的字符,它就是第一个标记的开头。
并为您提供相关报价:
4然后strtok函数从那里搜索当前分隔符字符串中包含的字符。 如果找不到这样的字符,则当前令牌会扩展到 s1指向的字符串的结尾,随后对标记的搜索将返回null 指针。如果找到这样的字符,它将被空字符覆盖,这是一个空字符 终止当前令牌。 strtok函数保存指向以下内容的指针 字符,从中开始下一次搜索令牌。
所以你不能用strtok捕获多个分隔符,因为它不是为此而制作的。 它只会跳过它们。