C/C++语言 计算字符串中子字符串出现的次数

任意输入2个字符串,求计算第二个字符串在第一个字符串中出现的次数。用c++写了程序,但是计算结果不对。求教!intmain(void){charstr1[20],str2... 任意输入2个字符串,求计算第二个字符串在第一个字符串中出现的次数。
用c++写了程序,但是计算结果不对。求教!

int main(void)
{
char str1[20],str2[20],*p1,*p2;

int sum=0;

cout<<"intput two strings"<<endl;

cin>>str1;
cin>>str2;

p1=str1;
p2=str2;

while (*p1!='\0')
{
if(*p1==*p2)

{ while((*p1=*p2)&&(*p2!='\0'))
{
p1++;
p2++;
}
}

else
p1++;
if(*p2=='\0')
sum=sum+1;

p2=str2;

}

cout<<sum;
return 0;

}
展开
 我来答
lgao622
推荐于2017-09-23 · 知道合伙人软件行家
lgao622
知道合伙人软件行家
采纳数:1137 获赞数:6550
毕业于武汉工程大学邮电与信息工程学院通信专业,软件行业,4年工作经验。

向TA提问 私信TA
展开全部

1.可通过 strstr 函数,查找子字符串。找到后即非空,然后加上子字符串偏移,再进行查找没,直到最后返回为空。

2.char *strstr( const char *str1, const char *str2 );

功能:函数返回一个指针,它指向字符串str2
首次出现于字符串str1中的位置,如果没有找到,返回NULL。

#include <stdio.h>
#include <string.h>

// 从str1中查找str2的个数,并返回
int findChildCnt(char* str1, char* str2)
{
    int len = strlen(str2);
    int cnt = 0;
    while (str1 = strstr(str1, str2)) // 如果查找到,则执行循环,否则为空退出循环
    {
        cnt++; // 统计次数
        str1 += len; // 加上偏移量,即移除str2
    }
    return cnt;
}

int main()
{
    char str1[100], str2[100];
    printf("intput str1 :");
    gets(str1);
    printf("intput str2 :");
    gets(str2);
    printf("Child Cnt: %d\n", findChildCnt(str1, str2));
    return 0;
}

辉腾无限
推荐于2017-09-28 · TA获得超过188个赞
知道答主
回答量:144
采纳率:0%
帮助的人:89.5万
展开全部
#include <iostream>
#include <math.h>

using namespace std;

int main()
{
char str1[20],str2[20],*p1,*p2;
int sum=0;
cout<<"intput two strings"<<endl;
cin>>str1;
cin>>str2;
p1=str1;
p2=str2;

while (*p1!='\0')
{
if(*p1==*p2)
{ //while((*p1==*p2)&&(*p2!='\0')&&(*p1!='\0'))
while((*p1==*p2)&&(*p2!='\0')) //有问题
{
p1++; //这里有问题
p2++;
}
}
else p1++;
if(*p2=='\0') sum=sum+1;
p2=str2;
}
cout<<sum;
return 0;

}
-----
例如:输入 ababababab ab
while (*p1!='\0'), if(*p1==*p2),判断都为真,进入 while((*p1==*p2)&&(*p2!='\0')) 循环,对比字串2的每一个字符,并将p1指针后移,当有不相等的字符退出循环,这时再进入这个循环时问题来了,P1的指针被后移了,确没有恢复。只把P2进行了恢复,也许作者认为不必要,但就是这不必要导致了程序出错,while((*p1==*p2)&&(*p2!='\0'))也没有对P1进行判断是否还能继续。
在输入字符串时也要注意,不能大于20个字符。否则要改数组大小。
--------------
修改后:
#include <iostream>
#include <math.h>

using namespace std;

int main()
{
char str1[255],str2[255],*p1,*p2, *temp;
int sum=0;
cout<<"intput two strings"<<endl;
cin>>str1;
cin>>str2;
p1=str1;
p2=str2;

while (*p1!='\0')
{
temp = p1;
if(*temp==*p2)
{

while((*temp==*p2)&&(*p2!='\0')&&(*temp!='\0'))
{
temp++;
p2++;
}
}
p1++;
if(*p2=='\0') sum=sum+1;
p2=str2;
}
cout<<sum;
return 0;

}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
freeoflyer
2012-06-03
知道答主
回答量:19
采纳率:0%
帮助的人:5.7万
展开全部
//还可以简单点
#include<iostream>
using namespace std;
int main()
{
int sum=0;
char sd[4];
char sc[300];
char* pd=sd;
char* pc=sc;
char* temp;
cout<<"enter two string"<<endl;
cin>>sd;
cin>>sc;
while(*pc!='\0')
{
temp=pc;
while(*temp==*pd)
{
temp++;
pd++;
}
if(*pd=='\0')
sum++;
pd=sd;
pc++;
}
cout<<sum;

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
忘至白葬不情必0T
2006-10-11 · TA获得超过3万个赞
知道大有可为答主
回答量:1.1万
采纳率:90%
帮助的人:1.2亿
展开全部
while((*p1=*p2)&&(*p2!='\0'))
里面把==写成=了,是*p1==*p2
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式