在线编译器 C

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

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

- 当字符串遍历到最后一个字符时,while循环会检查`m[i]!='\0'`,但此时`m[i+1]`是字符串结束符`\0`,这会导致最后一次比较时,`m[i]`与`\0`不相等,从而进入else分支输出当前字符及其计数。这个逻辑本身是可行的,但需要确认当字符串末尾只有一个字符时(例如输入"ab"),输出是否如预期为"a1b1"。

- 你的代码中`sum`初始值为1,这表示从第一个字符开始计数。当遇到不同字符时,会输出前一个字符及其计数,然后重置`sum=1`。这个设计是合理的,但注意在循环结束后,最后一个字符的计数已经输出,不需要额外处理。