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

时间:2010-02-01 22:03:44

标签: c string search

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

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

此功能将返回“550找到两次”....

8 个答案:

答案 0 :(得分:11)

使用strstr

int count_550s(char const *str)
{
    char const *p = str;
    int count;
    for (count = 0; ; ++count) {
        p = strstr(p, "550");
        if (!p)
            break;
        p++;
    }
    return count;
}

编辑:忘记“返回”。

答案 1 :(得分:5)

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

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

你可以这样做:

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
}

但是如果你的目的是找到一般的副本(即不知道搜索字符串),你应该使用一个正则表达式库,它支持两次匹配相同的组模式。

答案 5 :(得分:1)

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

答案 6 :(得分:1)

不,但你可以自己建一个。

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;
}

答案 7 :(得分:-2)

  1. 编写一个函数str_search(char * s1,char * s2,int n),该函数需要两个字符串和一个整数,如 参数并返回一个指针,该指针指向第二个字符串s2中第一个字符串s1的第n次出现, 如果不存在第n次,则返回NULL。