分隔符后没有数据时的 strtok
strtok when no data after a delimiter
我需要知道什么时候两个分隔符之间没有数据,所以我在 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>
使用当前代码,它不会处理最后一个',' 之后的数据,应该还有一个空字段。我不确定如何获得正确的输出。
您应该使用 strsep
而不是 strtok
。事实上,strsep
支持空字段:See this answer
这是一个例子:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main () {
char delims[] = ",";
char data [] = "foo,bar,,baz,biz,,";
char *p = strdup(data);
char * tok;
while ((tok = strsep(&p, delims)) != NULL) {
printf ("%s\n", *tok ? tok : "<empty>");
}
free(p);
return 0;
}
输出:
foo
bar
<empty>
baz
biz
<empty>
<empty>
我需要知道什么时候两个分隔符之间没有数据,所以我在 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>
使用当前代码,它不会处理最后一个',' 之后的数据,应该还有一个空字段。我不确定如何获得正确的输出。
您应该使用 strsep
而不是 strtok
。事实上,strsep
支持空字段:See this answer
这是一个例子:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main () {
char delims[] = ",";
char data [] = "foo,bar,,baz,biz,,";
char *p = strdup(data);
char * tok;
while ((tok = strsep(&p, delims)) != NULL) {
printf ("%s\n", *tok ? tok : "<empty>");
}
free(p);
return 0;
}
输出:
foo
bar
<empty>
baz
biz
<empty>
<empty>