【问题标题】:Is there a C function to find the second occurrence of substring in string?是否有一个 C 函数来查找字符串中子字符串的第二次出现?
【发布时间】:2011-01-11 22:21:08
【问题描述】:

是否有 C 函数来查找字符串中子字符串的第二次出现?

即字符串 - “213 文件状态 550 访问被拒绝。550 访问被拒绝。”

这个函数会返回“550 found两次”......

【问题讨论】:

    标签: c string search


    【解决方案1】:

    使用strstr。由于strstr 返回指向第一次出现的指针的指针,因此您可以使用结果来查找下一次出现。

    例如,统计字符串"550"的出现次数:

    #include <string.h>
    
    int count_550s(const char *str)
    {
        const char *ptr = str;
        int count = 0;
        while ((ptr = strstr(ptr, "550")) != NULL) {
            // ptr is pointing at "550...", so we skip
            // over the "550".
            ptr += 3;
            count++;
        }
        return count;
    }
    

    【讨论】:

    • 您甚至可以通过将p = strstr(p, "550") 作为for 语句中的条件来摆脱if
    【解决方案2】:
    1. 编写一个函数 str_search(char* s1,char* s2, int n) ,它接受两个字符串和一个整数,如 参数并返回指向第二个字符串 s2 中第一个字符串 s1 第 n 次出现的指针, 如果第 n 次出现不存在,则为 NULL。

    【讨论】:

      【解决方案3】:

      不,但您可以自己构建一个。

      const char *find_second_substring(const char *findme,const char *str)
      {
         const char *tmp;
         if((tmp = strstr(str,findme)) != null) {
           tmp = strstr(tmp  +strlen(findme),findme);
         }
      
        return tmp;
      }
      

      【讨论】:

        【解决方案4】:

        您可以通过在循环中调用 strstr 来做到这一点(haystack 是指您在“213 文件状态 550 访问被拒绝。550 访问被拒绝”中搜索的字符串。而 needle 是指您正在搜索的字符串“550”) :

        unsigned int count = 0;
        const char *next = haystack
        while ((next = strstr(next, needle)) != NULL)
        {
            ++count;
            ++next;
        }
        

        如果你的两个实例 needle 可以相互重叠(所以你正在寻找“555”,并且字符串中有“5555”,这将计算两个实例)。如果你不想这样,你应该把++next改成next += strlen(needle);

        【讨论】:

          【解决方案5】:

          如果您知道您感兴趣的子字符串,您可以反复调用strstr 来查找它。如果您事先不知道子字符串(我怀疑是这种情况),那么您可能想要找到最大长度的重复字符串。为此,suffix arrays 可能是一个解决方案。

          【讨论】:

            【解决方案6】:

            你可以这样做:

            char *yourText = "213 File status 550 Access Denied. 550 Access Denied.";
            
            char *found = strstr(yourText, "550 Access Denied");
            
            if(found != NULL && strstr(found+1, "550 Access Denied"))
            {
                // second occurrence found
            }
            

            但是,如果您的意图是寻找一般的重复项(即不知道搜索字符串),您应该使用支持两次匹配相同组模式的正则表达式库。

            【讨论】:

            • 是的,我有类似的东西,但看起来 strtok() 可能更好......?
            【解决方案7】:

            strstr() 返回一个指向找到的字符串的指针,因此您可以使用它进行第二次搜索(如果找到第一个则将其增加一个)。

            【讨论】:

              【解决方案8】:

              查看此处和 GNU 网站 here 上的“strtok”函数。这是另一个关于 strtok 函数的链接,也发现了here

              希望这会有所帮助, 最好的祝福, 汤姆。

              【讨论】:

              • 我不明白这有什么帮助。 strtok() 将使用指定的字符集作为分隔符将字符串分解为标记。您将如何使用它来查找子字符串?
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-10-02
              • 2010-12-25
              • 1970-01-01
              • 2020-02-14
              • 2018-03-22
              • 1970-01-01
              相关资源
              最近更新 更多