c - 分隔符后没有数据时的 strtok
问题描述
我需要知道两个分隔符之间什么时候没有数据,所以我在 Stack Overflow 上找到了以下代码。
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
支持空字段:请参阅此答案
这是一个例子:
#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>
推荐阅读
- javascript - 在 for 循环或数组方法中处理异步调用 (apis) 有哪些不同的方法?
- javascript - 如何发送 cron 消息以发送到特定频道
- python - ParserWarning:回退到“python”引擎,因为“c”引擎不支持正则表达式分隔符
- api - 空手道框架:从示例部分传递空输入参数的 GET 方法
- lodash - 如何使用 svelte 导入 lodash?
- python - scipy.spatial.transform.Rotation 旋转数组与同一对象内的堆栈
- python - 如何从 python 中的 txt 文件加载代理?
- java - 尝试将 Java 应用程序推送到 Cloud Foundry 时收到 404 Not Found 错误消息
- scala - 将 json 字符串列缩减为 key/val 列
- google-bigquery - 在 Bigquery 中使用 where 条件更新嵌套记录