如何使用模式匹配拆分字符串?

时间:2017-12-08 09:55:19

标签: c arrays split strtok strstr

我有一个类似" 123的字符串 - # - # - abc-user - # - # - abcpassword - # - # - 123456",我需要将此字符串拆分为模式" - # - # - "创建一个数组。我使用以下代码来执行此操作

    char buf[5000];
    strcpy(buf, "123-#-#-abc-user-#-#-abcpassword-#-#-123456");
    int i = 0;
    char *p = strtok (buf, "-#-#-");
    char *array[5000];

    int items = 0;
    while (p != NULL)
    {
        items++;
        array[i++] = p;
        p = strtok (NULL, "-#-#-");
    }

但结果并没有得到" 123 - # - # - abc-user - # - # - abcpassword - # - # - 123456"由于" abc-user"中的连字符。我期待的是array [0]有123,array [1]有abc-user,array [2]有abcpassword等。有没有其他方法可以拆分成具有确切模式的数组?

1 个答案:

答案 0 :(得分:3)

strtok()这里不会产生您期望的确切输出。查看详细信息C11,章节§7.24.5.8

  

对strtok函数的一系列调用将s1指向的字符串分解为一个   标记序列,每个标记由由指向的字符串中的字符分隔   s2 [...]

因此,整个分隔符字符串的任何字符的存在将导致标记化。

您需要查找strstr(),其中搜索更大字符串中的子字符串。再次,从C11,第7.24.5.7章

char *strstr(const char *s1, const char *s2);
     

strstr函数在s1指向的字符串中找到第一个匹配项   指向的字符串中的字符序列(不包括终止空字符)   s2

  

strstr函数返回指向所定位字符串的指针,如果是字符串则返回空指针   找不到。 [...]

所以你可以

  • 使用函数调用
  • 取非null返回指针
  • 执行指针运算以达到您想要的下一个标记。