Online Compiler C

#include <stdio.h> #include <string.h> void result(char c[]) { int i = 0; int counter = 1; while (c[i] != '\0') { if (c[i] == c[i + 1] && c[i + 1] != '\0') { counter++; } else { printf("%c%d", c[i], counter); counter = 1; } i++; } } int main() { char a[1001]; scanf("%[^\n]", a); result(a); return 0; }
这段代码实现了一个简单的“游程编码”功能,将字符串中连续相同的字符压缩成“字符+重复次数”的形式输出。例如输入"aaabbbcc"会输出"a3b3c2"。

代码逻辑基本正确,但有一个边界情况需要留意。

- 当字符串末尾的字符连续出现时,循环结束后没有输出最后一组字符的计数。例如输入"aab"会输出"a2",漏掉了最后的"b1"。
- 在判断连续字符时,条件`c[i] == c[i + 1] && c[i + 1] != '\0'`中,当`c[i+1]`是结束符时,`c[i]`与`c[i+1]`不相等,会进入else分支输出当前字符和计数,所以末尾单个字符的情况其实能正常输出。但问题在于:如果末尾有连续多个相同字符,比如"aa",循环到i=1时,`c[1]`是'a',`c[2]`是'\0',条件不成立,输出"a2",这是正确的。但如果末尾字符只出现一次,比如"ab",循环到i=1时,`c[1]`是'b',`c[2]`是'\0',条件不成立,输出"b1",也是正确的。所以实际上代码对末尾单个字符的处理没有问题。真正的问题在于:当字符串中所有字符都相同时,比如"aaa",循环到i=2时,`c[2]`是'a',`c[3]`是'\0',条件不成立,输出"a3",正确。所以这段代码似乎没有明显的错误?再仔细看:如果输入"aab",循环过程:i=0时c[0]='a',c[1]='a'相等,counter=2;i=1时c[1]='a',c[2]='b'不相等,输出"a2",counter重置为1;i=2时c[2]='b',c[3]='\0'不相等,输出"b1"。输出"a2b1",正确。所以代码实际上能正确处理所有情况?但有一个潜在问题:当字符串末尾有连续字符时,比如"aa",输出"a2",正确