在线编译器 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++; }if(sum==1){ printf("%c",m[i]); }else{ printf("%c%d",m[i],sum); } } int main(){ char m[1000]; scanf("%s",m); //printf("%s",m); same(m); return 0; }
这段代码实现了一个字符串的“游程编码”压缩功能。它遍历输入的字符串,统计每个连续相同字符的出现次数,然后输出字符及其出现次数(如果只出现一次则只输出字符)。

代码中存在一个逻辑错误,导致输出结果可能不正确。

- 在循环结束后,你再次检查了 `sum` 并尝试输出 `m[i]`,但此时 `i` 已经指向了字符串结束符 `\0`,所以 `m[i]` 是 `\0`,这会导致输出一个空字符或意外行为。你应该在循环结束后处理最后一个字符组,但需要记住最后一个字符是 `m[i-1]` 而不是 `m[i]`。

- 另外,注意循环内部处理连续字符的逻辑:当遇到不同字符时,你输出了前一个字符组,但循环结束后还需要处理最后一组。你的处理方式正确,但索引错了。