是否有C函数来查找字符串中第二次出现的子字符串?
即。字符串 - “213文件状态550访问被拒绝.550访问被拒绝。”
此功能将返回“550找到两次”....
答案 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)
答案 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)