C++不自定义函数统计主串中子串出现次数的实现咨询
实现思路
全程不需要自定义额外函数,所有逻辑直接写在main函数内即可,先修正你现有代码的问题,再按通用匹配逻辑实现:
- 首先修正基础下标错误:C++中
string下标从0开始计数,你原代码访问stringtofind[1]作为子串首字符、stringtofind[2]作为第二个字符,既跳过了子串真正的首字符,还越界访问了长度为2的字符串的非法内存位置 - 修正匹配逻辑:原代码找到第一个匹配字符后,会遍历后面所有位置找第二个匹配字符,没有要求字符连续,会把不连续的字符误判为匹配;同时逻辑写死仅支持长度为2的子串,通用性差
- 增加边界判断:如果子串长度大于主串长度、或者子串为空,直接判定出现次数为0,不需要走遍历逻辑
- 遍历主串的合法起始位置:只需要遍历主串下标0到
主串长度-子串长度的范围即可,超过这个范围的位置剩余字符长度不足,不可能匹配到完整子串 - 逐位校验匹配:对每个起始位置,逐位对比主串从该位置开始的字符和子串对应位置的字符,全部一致则计数加1
修正后可直接运行的代码
#include <string> #include <iostream> using namespace std; int main() { int count = 0; string phrase, stringtofind; phrase = "ANANAS"; stringtofind = "NA"; int main_len = phrase.size(); int sub_len = stringtofind.size(); // 处理边界场景 if (sub_len > 0 && sub_len <= main_len) { // 遍历所有合法匹配起点 for (int i = 0; i <= main_len - sub_len; i++) { bool is_match = true; for (int j = 0; j < sub_len; j++) { if (phrase[i + j] != stringtofind[j]) { is_match = false; break; } } if (is_match) { count++; } } } cout << "The string " << stringtofind << " was found " << count << " times in your phrase"; return 0; }
运行上述代码,针对你给出的ANANAS查找NA的样例,会正确输出匹配次数为2。如果需要支持用户输入主串和子串,直接在变量定义后加cin >> phrase >> stringtofind;替换硬编码的赋值即可,同样不需要新增自定义函数。
内容的提问来源于stack exchange,提问作者Kontula
相关产品推荐
相关产品推荐

