我正在尝试编写一个获取两个字符串的函数,一个名为str1的短字符串和一个名为str2的较长字符串。
该函数将计算在str2中找到str1的次数。
example: str1= 'ab' str2 = 'abab' print 2
但出于某种原因,对于上面的例子。我得到3.这是我的代码:
int how_many_times(char* str1,char* str2)
{
int result=0,i,j=0;
for(i=0;i<strlen(str2);i++)
{
if((str1[i]==str2[j]))
{
while(str1[i]==str2[j])
{
j++;
if(j==strlen(str1))
{
result++;
j=0;
}
i++;
}
}
else
i++;
}
printf("%d",result);
getch();
return result;
}
答案 0 :(得分:3)
int count(char *s1, char *s2)
{
char *p;
int c;
c = 0;
for (p = strstr(s2, s1); p; p = strstr(p, s1)) {
c++;
p++;
}
return c;
}
答案 1 :(得分:2)
由于这可能是一个学习练习,我不建议使用库函数,假设你宁愿修改你的代码。
您的代码即将开始运作:
i
的代码中交换了j
和str[...]
- 您需要使用str1
访问j
并且str2
与i
i
,而不是相反,因为strlen(str2)
最多j
而strlen(str1)
最多j
else
重置为零 - if
的{{1}}分支需要在j
之后重置int how_many_times(char* str1,char* str2)
{
int result=0,i,j=0;
for(i=0;i<strlen(str2);i++)
{
if((str1[j]==str2[i])) // <<<=== Swapped i and j
{
while(str1[j]==str2[i]) // <<<=== Swapped i and j
{
j++;
if(j==strlen(str1))
{
result++;
j=0;
}
i++;
}
}
else {
i++;
j = 0; // <<<=== Added
}
}
return result;
}
已找到部分匹配。这是your modified code running on ideone。
{{1}}
P.S。基于库的解决方案更好: - )
答案 2 :(得分:1)
strstr函数返回指向另一个字符串中第一个字符串的指针。我们可以使用它来通过递增变量count
来计算出现次数,直到函数返回NULL。
int countOccur(char *a, char *b) {
int count = 0;
while (b = strstr(b, a)) {
count++;
b++;
}
return count;
}
答案 3 :(得分:1)
我想出了这个(不使用strstr,但确实使用了strlen):
int how_many_times(char *str, char *str2) {
int result = 0, i = 0, j, k, len = strlen(str);
while(str2[i]) {
j = 0;
k = 0;
while(1) {
if(str[j + k] == str2[i + k] && str[j] != 0) {
if(j + k == len - 1) {
result++;
break;
}
} else {
break;
}
k++;
}
i++;
}
return result;
}