【发布时间】:2011-01-11 22:21:08
【问题描述】:
是否有 C 函数来查找字符串中子字符串的第二次出现?
即字符串 - “213 文件状态 550 访问被拒绝。550 访问被拒绝。”
这个函数会返回“550 found两次”......
【问题讨论】:
是否有 C 函数来查找字符串中子字符串的第二次出现?
即字符串 - “213 文件状态 550 访问被拒绝。550 访问被拒绝。”
这个函数会返回“550 found两次”......
【问题讨论】:
使用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。
【讨论】:
不,但您可以自己构建一个。
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;
}
【讨论】:
您可以通过在循环中调用 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);
【讨论】:
如果您知道您感兴趣的子字符串,您可以反复调用strstr 来查找它。如果您事先不知道子字符串(我怀疑是这种情况),那么您可能想要找到最大长度的重复字符串。为此,suffix arrays 可能是一个解决方案。
【讨论】:
你可以这样做:
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
}
但是,如果您的意图是寻找一般的重复项(即不知道搜索字符串),您应该使用支持两次匹配相同组模式的正则表达式库。
【讨论】:
strstr() 返回一个指向找到的字符串的指针,因此您可以使用它进行第二次搜索(如果找到第一个则将其增加一个)。
【讨论】: