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
相关产品推荐
相关产品推荐

