我正在尝试对字符串进行标记,但我需要确切知道两个令牌之间何时没有数据.例如,当标记以下字符串" a,b,c,,,d,e"时,我需要知道' d'和' e' 之间的两个空槽...我无法简单地找到它strtok().我的尝试如下所示:
char arr_fields[num_of_fields];
char delim[]=",\n";
char *tok;
tok=strtok(line,delim);//line contains the data
for(i=0;i<num_of_fields;i++,tok=strtok(NULL,delim))
{
if(tok)
sprintf(arr_fields[i], "%s", tok);
else
sprintf(arr_fields[i], "%s", "-");
}
Run Code Online (Sandbox Code Playgroud)
用上述例子执行上述代码将字符a,b,c,d,e放入前五个元素中arr_fields是不可取的.我需要每个字符的位置进入数组的特定索引:即如果两个字符之间缺少一个字符,则应该按原样记录.
Fil*_*efp 13
7.21.5.8 strtok函数
标准说明如下strtok:
[#3]序列中的第一个调用搜索指向的字符串,查找
s1当前分隔符字符串中未包含的第一个字符s2.如果没有找到这样的字符,则指向的字符串中没有标记,s1并且该strtok函数返回空指针.如果找到这样的字符,则它是第一个标记的开头.
在上面的引用中,我们可以读到您不能strtok用作特定问题的解决方案,因为它会将任何序列字符delims视为单个令牌.
您可以轻松实现自己strtok喜欢的版本,请参阅本文末尾的摘要.
strtok_single使用strpbrk (char const* src, const char* delims)它将返回一个指针,该指针指向在以null结尾的字符串src中找到的delim中任何字符的第一个匹配项.
如果未找到匹配的字符,则该函数将返回NULL.
strtok_single
char *
strtok_single (char * str, char const * delims)
{
static char * src = NULL;
char * p, * ret = 0;
if (str != NULL)
src = str;
if (src == NULL)
return NULL;
if ((p = strpbrk (src, delims)) != NULL) {
*p = 0;
ret = src;
src = ++p;
} else if (*src) {
ret = src;
src = NULL;
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)
样品使用
char delims[] = ",";
char data [] = "foo,bar,,baz,biz";
char * p = strtok_single (data, delims);
while (p) {
printf ("%s\n", *p ? p : "<empty>");
p = strtok_single (NULL, delims);
}
Run Code Online (Sandbox Code Playgroud)
产量
foo
bar
<empty>
baz
biz
Run Code Online (Sandbox Code Playgroud)