基于for循环实现游程长度编码时输出结果异常的问题
游程编码实现逻辑错误修正
核心问题定位
原代码存在4处逻辑硬伤,直接导致输出完全错位:
- 计数多算1次:内层循环从
in = r起步,第一次判断时是同一字符自比较,搭配初始值为1的count,会把连续字符数多算1。例如开头2个连续的a,会被计数为3。 - 输出内容错位:遇到不同字符触发分支时,
r被直接修改为下一段的起点,此时输出的str[r]是下一段的字符,而非当前统计段的字符——统计a段的逻辑里,实际输出的是后续f段的字符,导致原段的统计结果完全丢失。 - 末尾段无输出:字符串最后一段字符遍历到末尾时,不会触发“遇到不同字符”的分支,最后一段的计数永远不会被打印,
count变量会停在最后一段的计数值。 - 循环变量自增冲突:内层分支手动修改了
r的值后,外层for循环每次仍会自动执行r++,导致下一段的起点偏移1位,漏算字符。
修正后代码
保留双层循环的实现结构,修正上述逻辑问题:
#include <iostream> #include <string> using namespace std; int main() { string str = "aafffkhjskk"; cout << str << endl; int count; // 外层循环去掉自动r++,手动控制分段跳转 for (int r = 0; r < str.length(); ) { count = 1; int in; // 内层从r的下一个位置开始遍历,避免自比较 for (in = r + 1; in < str.length(); in++) { if (str[in] == str[r]) { count++; } else { break; } } // 内层遍历结束后立刻输出当前段的统计值 cout << count << " ****** " << str[r] << endl; // 直接跳转到下一段的起始位置 r = in; } return 0; }
修正后运行输出与预期一致:
aafffkhjskk 2 ****** a 3 ****** f 1 ****** k 1 ****** h 1 ****** j 1 ****** s 2 ****** k
内容的提问来源于stack exchange,提问作者Lalitb
相关产品推荐
相关产品推荐

