gpt4 book ai didi

c - 需要知道何时使用 strtok() 两个标记分隔符之间没有数据出现

转载 作者:太空狗 更新时间:2023-10-29 17:05:47 25 4
gpt4 key购买 nike

我正在尝试标记一个字符串,但我需要确切地知道何时在两个标记之间看不到数据。例如,当标记以下字符串“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", "-");
}

使用上述示例执行上述代码会将字符 a、b、c、d、e 放入 arr_fields 的前五个元素中,这是不可取的。我需要每个字符的位置进入数组的特定索引:即如果两个字符之间缺少一个字符,则应按原样记录。

最佳答案

7.21.5.8 strtok函数

标准对 strtok 的描述如下:

[#3] The first call in the sequence searches the string pointed to by s1 for the first character that is not contained in the current separator string pointed to by s2. If no such character is found, then there are no tokens in the string pointed to by s1 and the strtok function returns a null pointer. If such a character is found, it is the start of the first token.

在上面的引用中,我们可以读到您不能使用 strtok 作为您特定问题的解决方案,因为它会将在 delims 中找到的任何连续字符视为 单一 token 。


我注定要默默地哭泣,还是有人可以帮助我?

您可以轻松地实现您自己的 strtok 版本来执行您想要的操作,请参阅本文末尾的代码片段。

strtok_single 使用 strpbrk (char const* src, const char* delims) 它将返回一个指向任何字符在 delims 中第一次出现的指针 在以 null 结尾的字符串 src 中找到。

如果没有找到匹配的字符,函数将返回 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;
}

示例使用

  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

关于c - 需要知道何时使用 strtok() 两个标记分隔符之间没有数据出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8705844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com