Онлайн компилятор 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]!='\0';i++){ s[i]=answer[i]; len++; } s[len]='\0'; } int main() { char s[] = "aaaaabbbc."; pack_string(s); printf("%s", s); return 0; }
这段代码试图实现字符串的游程编码(Run-Length Encoding),将连续重复的字符压缩成"字符+重复次数"的形式。例如"aaaaabbbc."应该变成"a5b3c1.",但代码中存在逻辑错误。

- 在循环中,每次遇到新字符时,你使用`sprintf`将当前字符和计数追加到`answer`中,但你没有正确处理最后一个字符组。当循环结束时,最后一个字符组(比如'c')的计数还没有被写入`answer`。

- 另外,你的循环条件是`s[i] != '.'`,这意味着循环会在遇到句点前停止,但句点本身没有被处理。你需要考虑是否要将句点也包含在编码中,或者单独处理它。