You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 05:48:19