从strtok()获取零长度字符串

Mau*_*ren 5 c csv strtok

我有一个包含数据的CSV文件

value;name;test;etc
Run Code Online (Sandbox Code Playgroud)

我试图通过使用分裂strtok(string, ";").但是,此文件可以包含零长度数据,如下所示:

value;;test;etc
Run Code Online (Sandbox Code Playgroud)

strtok()跳过.有没有办法可以避免strtok像这样跳过零长度数据?

Mar*_*n R 5

可能的替代方法是使用BSD功能strsep()而不是(strtok()如果可用).从手册页:

strsep()功能旨在替代该strtok() 功能.虽然strtok()出于可移植性原因该函数应该是首选的(它符合ISO/IEC 9899:1990("ISO C90"))但是它无法处理空字段,即检测由两个相邻分隔符字符分隔的字段,或者用于一次不止一个字符串.该strsep()功能首次出现在4.4BSD中.

一个简单的例子(也从该手册页复制):

char *token, *string, *tofree;

tofree = string = strdup("value;;test;etc");
while ((token = strsep(&string, ";")) != NULL)
    printf("token=%s\n", token);

free(tofree);
Run Code Online (Sandbox Code Playgroud)

输出:

token=value
token=
token=test
token=etc

所以空字段处理正确.

当然,正如其他人已经说过的,这些简单的tokenizer函数都没有正确处理引号内的分隔符,所以如果这是一个问题,你应该使用一个合适的 CSV解析库.