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

C++统计CString中连续双字母频次的代码排错与实现指导

代码问题排查

现有代码存在以下核心问题:

  • 无聚合统计逻辑:每匹配到一组连续双字母就直接打印,没有对相同组合做次数累加,因此出现3次的ee会被打印3行
  • 计数变量逻辑错误:每次循环末尾都将counter重置为0,无法实现跨位置的次数累计
  • 输出顺序不符合要求:边遍历边输出的逻辑无法保证按字母序排列结果
  • 未满足控制台读入要求:当前字符串为硬编码写死,没有实现从控制台读取段落的功能
  • 存在内存越界风险:循环遍历到字符串最后一位时,访问str[i+1]会读取字符串终止符后的未知内存
  • 未过滤非字母字符:如果相邻的标点、空格重复会被误统计

修改方案

  • 用长度为26的整型数组存储统计结果:数组索引对应双字母组合(索引0为aa、1为bb,以此类推索引25为zz),数组值存储对应组合的出现次数,遍历数组输出时天然符合字母序要求
  • 调整遍历边界:循环最大下标设为字符串长度-2,保证i+1始终在合法内存范围内
  • 增加字符判断:仅当两个相邻字符都是字母且相等时,才给对应计数项加1,跳过空格、标点的匹配
  • 替换硬编码字符串为整行读取逻辑,使用cin.getline()读取带空格的整段输入
  • 全字符串遍历统计完成后,再按索引从小到大遍历计数数组,输出所有计数值大于0的组合和对应次数

修改后可运行代码

#include <iostream>
#include <cstring>
#include <cctype>
using namespace std;

void countDoubleLetter();

int main() {
    countDoubleLetter();
    return 0;
}

void countDoubleLetter() {
    char str[2048] = {0};
    // 读取控制台输入的整段内容
    cin.getline(str, 2047);
    int cnt[26] = {0};
    int len = strlen(str);
    
    // 统一转换为小写,避免大小写导致统计遗漏
    for (int j = 0; j < len; j++) {
        str[j] = tolower(str[j]);
    }
    
    // 遍历统计连续重复双字母
    for (int i = 0; i < len - 1; i++) {
        if (isalpha(str[i]) && str[i] == str[i+1]) {
            cnt[str[i] - 'a']++;
        }
    }
    
    // 按字母顺序输出结果
    for (int i = 0; i < 26; i++) {
        if (cnt[i] > 0) {
            cout << (char)('a' + i) << (char)('a' + i) << "  " << cnt[i] << endl;
        }
    }
}

效果验证

使用题目给定样例测试:

输入:Double bubble deep in the sea of tooth with teeth and meet with riddle.
输出:
bb 1
dd 1
ee 3
oo 1
输出结果与预期完全一致。

内容的提问来源于stack exchange,提问作者LordVader

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:57:14