Онлайн компилятор C

#include <stdio.h> void pack_string(char s[]) { int i = 0; char answer[100]; while (s[i] != '.') { int count = 0; char n = s[i]; while (s[i] != '.' && s[i] == n) { count++; i++; } sprintf(answer, "%s%c%d", answer,n, count); } int len=0; 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` 当前的内容追加到自身,但 `answer` 没有被初始化,第一次使用时内容不确定,会导致结果混乱。你应该先让 `answer` 成为一个空字符串。
- 外层循环的条件是 `s[i] != '.'`,但内层循环结束后,如果遇到 `'.'` 会退出,但此时 `'.'` 本身没有被处理。你需要考虑如何处理字符串末尾的终止符或句点。
- 最后将 `answer` 复制回 `s` 时,你用了 `answer[i]!='.'` 作为循环条件,但 `answer` 中可能没有 `'.'`,这会导致循环越界。你应该用 `answer` 的实际长度来控制复制。