【问题标题】:strtok weird behavior on tokenizationstrtok 关于标记化的奇怪行为
【发布时间】:2021-10-20 04:53:13
【问题描述】:

下面的代码给出了意外的行为。

#include <stdio.h>
#include <string.h>

int main()
{
    
    char s[] = "hello $";
    char *t;
    t = strtok(s, "$$");
    printf("%s", t);

    return 0;
}

为什么输出hello 而不是hello $

【问题讨论】:

  • 该函数使用第二个参数中的 set 个字符进行标记,它将仅使用第二个参数字符串中的一个字符。
  • 第二个参数是一个包含多个独立单字符分隔符的字符串,不是子字符串。
  • 那我应该如何用字符串分割呢?
  • “strtok 奇怪的行为”是不言而喻的。它的怪异是设计使然。

标签: c string tokenize c-strings strtok


【解决方案1】:

来自 C 标准(7.23.5.8 的 strtok 函数)

2 对 strtok 函数的一系列调用会破坏指向的字符串 to by s1 成一系列记号,每个记号由一个 s2所指向的字符串中的字符

在本次通话中

t = strtok(s, "$$");

参数 s2 设置为具有两个相同的分隔符。所以调用相当于

t = strtok(s, "$");

如果您需要在字符串中查找子字符串“$$”,您可以使用标准 C 字符串函数strstr。例如

#include <stdio.h>
#include <string.h>

int main(void) 
{
    char s[] = "hello $";
    
    char *p = strstr( s, "$$" );
    
    if ( p ) *p = '\0';
    
    puts( s );
    
    return 0;
}

【讨论】:

    【解决方案2】:

    在你写的评论中:

    那我应该如何用字符串分割呢?

    据我所知,没有标准的方法(没有预定义的库函数)可以做到这一点。

    您可以使用strstr 编写自己的字符串拆分循环。这是一种方法:

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        char s[] = "hello$$this$$is$$a$$test";
        char *sep = "$$";
        char *p = s;
        char *p2;
        int i = 1;
        do {
            p2 = strstr(p, sep);
            if(p2 != NULL) *p2 = '\0';
            printf("%d: %s\n", i++, p);
            if(p2 != NULL) p = p2 + strlen(sep);
        } while(p2 != NULL);
    }
    

    这可以改进,但它有效,它应该让你开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多