出现的次数是指长串中可以同时截取出多少个子串。例如:子串"aaa"
在"aaaaaaa"
中出现的次数为2
次。
C++
提供了一系列操作字符串的函数,本方法需要使用两个(strstr()与strlen())相关函数,使用这些函数只要在代码的头文件部分包含string.h
即可。
常用的字符串处理函数见下图:
在一个长串中查找子串可以使用strstr
函数,该函数的函数原型为:
char* strstr(const char* s1, const char* s2);
该函数从s1
所指字符串中第一个字符起,顺序向后查找出与s2
所指字符串相同的子串,若查找成功则返回该子串首次出现的首地址,否则返回NULL
。
例如:
char *a="abcdeabcde";
char *b="bcd";
cout<<strstr(a,b)<<endl;
该程序输出结果为
bcdeabcde
,因为strstr(a, b)
的返回值为bcd
在abcdeabcde
中第一次出现的首地址,所以用cout
输出时,从该位置的字符开始,逐个输出直到'\0'
,即字符串"bcdeabcde"
。
当然,查找子串时,也可以从长串的某个位置开始。
例如:
char *a="abcdeabcde";
char *b="bcd";
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
指向字符串的长度并返回。
例如:
char *a="x";
char *b="Hello world!";
cout<<strlen(a)<<endl; // 输出1
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 **********/
}