【问题标题】:Split string by a substring通过子字符串拆分字符串
【发布时间】:2016-04-28 19:21:15
【问题描述】:

我有以下字符串:

char str[] = "A/USING=B)";

我想以/USING= 为分隔符拆分以获取单独的AB

我该怎么做?我知道strtok(),但它只是被一个字符分割为分隔符。

【问题讨论】:

  • 您可以使用strchr 查找'/''='')' 字符,并使用例如获取子字符串strncpy(或者只是简单的strcpy,如果你可以修改源字符串)。
  • 我只知道我的输入字符串恰好有 /USING= 是唯一的,AB 只是举例,可能包括 ` or =`
  • 那么strstr如何找到子字符串的起始位置
  • 可以使用strstr获取/USING的位置,根据这个位置进行拆分
  • @Ryo,我已经回答了你的问题。另一个网站上也有人问过这个问题。我的答案使用strtok,但仍然成功拆分它。我什至提到了之前提出的问题。看看吧。

标签: c string tokenize strtok


【解决方案1】:

老兄,这个答案只有在输入是这个时才有效,如果“abUcd/USING=efgh”你的算法不起作用。

这个答案对我唯一有效:

char *split(char *str, const char *delim)
{
    char *p = strstr(str, delim);

    if (p == NULL) return NULL;     // delimiter not found

    *p = '\0';                      // terminate string after head
    return p + strlen(delim);       // return tail substring
}

int main(void)
{
    char str[] = "A/USING=B";
    char *tail;

    tail = split(str, "/USING=");

    if (tail) {
        printf("head: '%s'\n", str);
        printf("tail: '%s'\n", tail);
    }

    return 0;
}

【讨论】:

    【解决方案2】:

    我知道strtok(),但它只是被一个字符分隔为分隔符

    不,不是。

    根据man pagestrtok(),(强调我的

    char *strtok(char *str, const char *delim);

    [...] delim 参数指定一个字节集,用于分隔已解析字符串中的标记。 [...] 已解析字符串中两个或多个连续分隔符字节的序列被视为单个分隔符。 [...]

    因此,它不必是您提到的“一个字符”。您可以使用字符串,例如 "/USING=" 作为分隔符来完成工作。

    【讨论】:

    • 答案无效,这不会正确拆分“U/USING=N”
    • @Sebastian 这更多是关于strtok() 与所示输入的用法。如果输入不同,还有其他方法可以使用,例如 strstr()
    • 您给人的印象是使用 strtok 是一个好主意,并且 OP 会假设它将解析其他包含 /USING= 的字符串。您至少应该警告他,它只适用于他的示例字符串,而不适用于任何包含子字符串 /USING= 的任意字符串
    • @JerryJeremiah 我错过了你的观点。你能详细说明一下吗?
    【解决方案3】:

    这里有一个小函数可以做到这一点。它的工作原理与 strtok_r 完全相同,只是分隔符被视为分隔字符串,而不是分隔字符列表。

    char *strtokstr_r(char *s, char *delim, char **save_ptr)
    {
        char *end;
        if (s == NULL)
            s = *save_ptr;
    
        if (s == NULL || *s == '\0')
        {
            *save_ptr = s;
            return NULL;
        }
    
        // Skip leading delimiters.
        while (strstr(s,delim)==s) s+=strlen(delim);
        if (*s == '\0')
        {
            *save_ptr = s;
            return NULL;
        }
    
        // Find the end of the token.
        end = strstr (s, delim);
        if (end == NULL)
        {
            *save_ptr = s + strlen(s);
            return s;
        }
    
        // Terminate the token and make *SAVE_PTR point past it.
        memset(end, 0, strlen(delim));
        *save_ptr = end + strlen(delim);
        return s;
    }
    

    【讨论】:

      【解决方案4】:

      this。当我在谷歌上搜索你的问题时,我得到了这个。

      你的情况是:

      #include <stdio.h>
      #include <string.h>
      
      int main (int argc, char* argv [])
      {
          char theString [16] = "abcd/USING=efgh";
          char theCopy [16];
          char *token;
          strcpy (theCopy, theString);
          token = strtok (theCopy, "/USING=");
          while (token)
          {
              printf ("%s\n", token);
              token = strtok (NULL, "/USING=");
          }
      
          return 0;
      }
      

      这使用/USING= 作为分隔符。

      这个输出是:

      abcd                                                                                                                                                                                                                      
      efgh 
      

      如果要查看,可以通过here在线编译运行。

      【讨论】:

      • 对不起,我只是为我的真实输入字符串实现char str[] = SELECT * FROM ACN WHERE CID=:C1 AND ACCTNAME=:C2/USING=(C1=70,C2='0D100S'),但它没有按我的预期工作,请帮我检查一下`
      • 给我一分钟。让我编译并检查一下。
      • 你能告诉我你得到的输出吗?
      • 好的,抱歉我的错误,但你能帮我解释为什么我的实际字符串不起作用,我更喜欢使用 strtok
      • @Ryo,给我一些时间。即使我不确定。我会回复你的。
      【解决方案5】:

      正如其他人指出的那样,您可以使用&lt;string.h&gt; 中的strstr 来查找字符串中的分隔符。然后复制子字符串或修改输入字符串以将其拆分。

      这是一个返回拆分字符串第二部分的实现。如果字符串不能拆分,则返回NULL,原字符串不变。如果需要将字符串拆分成更多的子字符串,可以反复调用尾部的函数。第一部分是输入字符串,可能会缩短。

      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      
      char *split(char *str, const char *delim)
      {
          char *p = strstr(str, delim);
      
          if (p == NULL) return NULL;     // delimiter not found
      
          *p = '\0';                      // terminate string after head
          return p + strlen(delim);       // return tail substring
      }
      
      int main(void)
      {
          char str[] = "A/USING=B";
          char *tail;
      
          tail = split(str, "/USING=");
      
          if (tail) {
              printf("head: '%s'\n", str);
              printf("tail: '%s'\n", tail);
          }
      
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-02
        • 2019-10-11
        相关资源
        最近更新 更多