计算一个字符串(子串)在另一个字符串(长串)中出现的次数(使用strstr()函数)。

这篇博客介绍了如何使用C++中的strstr()和strlen()函数来统计一个子串在长串中出现的次数。通过示例代码解释了strstr()函数的工作原理,以及如何从找到的子串位置开始继续查找,从而避免死循环。文章还提供了完整的frequency函数实现,用于计算子串在长串中的频率。
摘要由CSDN通过智能技术生成

出现的次数是指长串中可以同时截取出多少个子串。例如:子串"aaa""aaaaaaa"中出现的次数为2次。

C++提供了一系列操作字符串的函数,本方法需要使用两个(strstr()与strlen())相关函数,使用这些函数只要在代码的头文件部分包含string.h即可。

常用的字符串处理函数见下图:

预览大图

在一个长串中查找子串可以使用strstr函数,该函数的函数原型为:

char* strstr(const char* s1, const char* s2);

该函数从s1所指字符串中第一个字符起,顺序向后查找出与s2所指字符串相同的子串,若查找成功则返回该子串首次出现的首地址,否则返回NULL

例如:

 
  1. char *a="abcdeabcde";
  2. char *b="bcd";
  3. cout<<strstr(a,b)<<endl;

该程序输出结果为bcdeabcde,因为strstr(a, b)的返回值为bcdabcdeabcde中第一次出现的首地址,所以用cout输出时,从该位置的字符开始,逐个输出直到'\0',即字符串"bcdeabcde"

当然,查找子串时,也可以从长串的某个位置开始。

例如:

 
  1. char *a="abcdeabcde";
  2. char *b="bcd";
  3. cout<<strstr(a+4,b)<<endl;

该程序的输出为bcde。因为a+4得到一个新地址,即a指向的字符串中第一个字符'e'的地址,从该位置开始查找b指向的字符串"bcd",得到从字符'e'开始的第一个"bcd"出现的地址,然后用cout输出该地址开始的字符串,即bcde

另外,下次从什么地方开始查找子串?应该是上次找到子串的开始位置加上子串的长度。其中,函数strlen可以计算字符串的长度,其函数原型为:

int strlen(const char *s);

函数strlen只有一个参数s,它是一个字符指针,代表了一个字符串,函数计算s指向字符串的长度并返回。

例如:

 
  1. char *a="x";
  2. char *b="Hello world!";
  3. cout<<strlen(a)<<endl; // 输出1
  4. cout<<strlen(b)<<endl; // 输出12

编程要求

本关的编程任务是补全step5/frequency.cpp文件中的frequency函数,以实现统计子串出现次数的功能。具体要求如下:

  • 本关要求补全函数frequency,该函数用于计算一个字符串(子串)在另一个字符串(长串)中出现的次数;
  • 实际的测试样例参见下文。

// 包含字符串函数库

// 包含字符串函数库
#include <string.h>
#include <iostream>
using namespace std;

int frequency(char * substr, char * str);

int main()
{
    char sub[128],str[1024];
    cin.getline(sub,128);     // 输入子串
    cin.getline(str,1024);     // 输入长串
    int n = frequency(sub,str);     // 调用frequency函数,计算子串在长串中出现的次数
    cout<<n<<endl;     // 输出次数
    return 0;
}

// 函数frequency:计算子串在长串中出现的次数
// 参数:substr-指向子串,str-指向长串
// 返回值:出现的次数
int frequency(char * substr, char * str)
{
    // 请在此添加代码,实现函数frequency
    /********** Begin *********/
    int i=0;//用于记录次数
    while(*str!='\0')//遍历整个长串
    {
        if(strstr(str,substr)!=NULL)//strstr()函数不为空证明str长串含有substr短串,前有介绍
        {
            i++;//if成立一次,找到子串次数加一。
           str=strstr(str,substr);//strstr()返回的是(长串中出现子串)地址,str指向该位置,为
                                  //下一步做准备。
           str+=strlen(substr);//跳过已找的子串。
        }
        else str++;//这个位置if else需配套使用,避免出现死循环。
    }
    return i;//返回次数。
    /********** End **********/
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值