在线编译器 C

#include <stdio.h> void pack_string(char s[]) { char c = s[0]; char answer[100] = {0}; int num = 0, len = 0; for (int i = 0; s[i] != '.'; i++) { if (s[i] == c) num++; else { sprintf(answer, "%s%c%d", answer, c, num); num = 1; } c = s[i]; } for(int i=0;answer[i]!='.';i++){ s[i]=answer[i]; len++; } s[len]='\0'; } int main() { char s[] = "aaaaabbbc."; pack_string(s); printf("%s", s); return 0; }
这段代码试图实现一个字符串压缩功能,将连续重复的字符替换为“字符+重复次数”的形式,例如将"aaaaabbbc."压缩为"a5b3c1."。但代码中存在逻辑错误,导致输出结果不正确。

- 在循环中,当字符变化时,你使用`sprintf`将当前字符和计数拼接到`answer`中,但每次拼接后没有重置`num`为1,而是先设置`num=1`再更新`c`,这会导致计数逻辑混乱。实际上,你应该在遇到新字符时,先处理前一个字符的计数,然后将`num`重置为1,并更新`c`为当前字符。
- 循环结束后,最后一个字符的计数没有被写入`answer`,因为循环只在遇到'.'时停止,而最后一个字符的计数需要在循环外单独处理。