Online Compiler C

#include <stdio.h> void pack_string(char s[]) { int time = 0; char c; for (int i = 0; s[i] != '.'; i++) { time++; c = s[i]; } int A[time], m = 0; for(int i = 0; i< time; i++) { A[i] = 1; } char B[time]; for (int i = 1; s[i] != '.'; i++) { if(s[i-1] == s[i]) { A[m]++; } else { B[m]= s[i-1]; m++; } } B[m+1] = c; for(int i =0 ; i < m+1; i++) { printf("%d%d", B[i], A[i]); } } int main() { return 0; }
这段代码试图实现一个字符串压缩功能,将连续重复的字符压缩成“字符+重复次数”的形式,但代码中存在多个逻辑错误。

- 第一个循环计算字符串长度时,用 `time` 记录字符数,但循环条件 `s[i] != '.'` 假设字符串以点号结尾,这限制了输入格式。
- 数组 `A` 和 `B` 的大小基于 `time`,但后续处理中 `m` 的增长可能超过 `time`,导致数组越界。
- 第二个循环中,当相邻字符不同时,才将前一个字符存入 `B`,但这样会漏掉最后一组连续字符的处理,且 `B[m+1] = c` 的赋值位置和索引可能错误。
- 最后的 `printf` 格式 `%d%d` 会将字符 `B[i]` 按整数打印,而不是字符本身,导致输出数字而非字母。

提示:
- 思考如何正确处理最后一组连续字符:当循环结束时,最后一组字符的计数和字符本身还没有被存入数组。
- 注意 `printf` 中格式说明符的区别:打印字符应使用 `%c`,打印整数使用 `%d`。