【发布时间】:2021-02-23 02:43:57
【问题描述】:
我需要知道两个分隔符之间什么时候没有数据,所以我在 Stack Overflow 上找到了以下 code。
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;
}
对函数进行采样
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);
}
输出
foo
bar
<empty>
baz
biz
<empty>
// missing another <empty>
使用当前代码,它不会处理最后一个','之后的数据,应该还有一个空字段。我不确定如何获得正确的输出。
【问题讨论】:
-
你为什么不实际使用
strtok()? -
提示:函数调用的语法通常像
f(...)没有空格,而像if或while这样的结构会得到特殊处理,因此它们会脱颖而出,如if (...)或 @987654331 @ 带空格。隔开你的函数调用会让它们看起来很糟糕。 -
@tadman 它折叠了多个连续的分隔符。
-
@tadman:可能是因为
strtok()将多个连续的分隔符视为一个分隔符,而不是分隔多个字段。不,你不能只包装strtok()来获得效果。您也许可以改用strsep()— 但这与strtok_single()一样是一个非标准函数。 -
好的;这是与我建议的不同的 SO 问题(SO 0870-5844)。尝试查看 SO 3029-4192;它可能会有所帮助。另外,请查看
strsep()。我有一大块测试代码在围绕着我写来回答一个我无法识别的问题(关于 SO),所以它可能被删除了。它在工作中显示strsep(),当分隔符为,时,它可以报告字符串",abc,def,,ghi,"(和开头的那个)末尾的空字段。这似乎就是你所追求的,不是吗?你也可以看看SO 5824-4300。