如何在C中用strtok返回NULL字符串?

时间:2014-08-05 14:52:55

标签: c strtok

我正在读一个.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);

1 个答案:

答案 0 :(得分:0)

引自ISO / IEC 9899:TC3 7.21.5.8 strtok函数

  

3序列中的第一个调用将搜索s1指向的字符串作为第一个字符   它不包含在s2指向的当前分隔符字符串中。如果没有这样的角色   找到,然后s1和strtok函数指向的字符串中没有标记   返回一个空指针。如果找到这样的字符,它就是第一个标记的开头。

并为您提供相关报价:

  

4然后strtok函数从那里搜索当前分隔符字符串中包含的字符如果找不到这样的字符,则当前令牌会扩展到   s1指向的字符串的结尾,随后对标记的搜索将返回null   指针。如果找到这样的字符,它将被空字符覆盖,这是一个空字符   终止当前令牌。 strtok函数保存指向以下内容的指针   字符,从中开始下一次搜索令牌。

所以你不能用strtok捕获多个分隔符,因为它不是为此而制作的。 它只会跳过它们。