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

#include <stdio.h> void pack_string(char s[]) { int i = 0; char answer[100]={0}; 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, "%s%c%d", answer,n, count)` 这一行有问题。`sprintf` 的第一个参数是目标缓冲区,但这里同时把 `answer` 既作为目标又作为源字符串的一部分,这会导致未定义行为,因为 `sprintf` 在写入时可能会覆盖正在读取的内容。你应该考虑使用其他方式将字符和数字追加到 `answer` 中,比如用 `sprintf` 先格式化到临时缓冲区,再用 `strcat` 拼接,或者直接使用索引手动写入。

- 在最后的循环中,你使用 `answer[i]!='.'` 作为终止条件,但 `answer` 中可能没有 `'.'` 字符,因为原字符串的 `'.'` 并没有被复制到 `answer` 中。这会导致循环越界。你应该用 `answer` 的实际长度来控制循环,或者用 `strlen` 获取长度。