在线编译器 C

#include <stdio.h> void pack_string(char s[]) { if (s[0] == '.') { return; } int time = 0; for (int i = 0; s[i] != '.'; i++) { time++; } if (time == 1) { printf("%c1",s[0]); return; } int A[1001]; int m = 0; for(int i = 1; i< time; i++) { A[i] = 0; } char B[1001]; B[0] = s[0]; A[0] = 1; for (int i = 1; i < time; i++) { if(s[i-1] == s[i]) { A[m]++; } else { m++; B[m] = s[i]; A[m] = 1; } } m++; for(int i = 0; i < m; i++) { printf("%c%d", B[i], A[i]); } return; } int main() { char a[1001]; scanf("%s", a); pack_string(a); return 0; }
这段代码试图实现一个字符串压缩功能:将连续相同的字符替换为该字符和出现次数,例如 "aaabbb" 压缩为 "a3b3"。字符串以 '.' 结尾作为终止标志。

代码中存在几个逻辑错误,导致输出结果不正确。

- 数组 A 的初始化循环从 i=1 开始,但 A[0] 没有被正确初始化,这可能导致后续计数出错。
- 在统计连续字符时,变量 m 的更新和数组索引的使用存在不一致,例如第一次遇到不同字符时 m 增加,但 B[m] 和 A[m] 的赋值可能覆盖之前的数据。
- 循环条件 for (int i = 1; i < time; i++) 中,当 i=1 时比较 s[0] 和 s[1],但 s[0] 已经被单独处理,逻辑上应该从第二个字符开始与上一个字符比较,但当前代码的索引和 m 的配合需要重新检查。