在线编译器 C

#include <stdio.h> void pack_string(char s[]) { if (s[0] == '.') { return; } 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; i < time; i++) { if(s[i-1] == s[i]) { A[m]++; } else { B[m]= s[i-1]; m++; } } B[0] = s[0]; B[m] = c; for(int i =0 ; i < m+1; i++) { printf("%c%d", B[i], A[i]); } return; } int main() { char a[1000]; scanf("%s", a); pack_string(a); return 0; }
这段代码试图实现字符串的游程编码(Run-Length Encoding),即把连续相同的字符压缩成“字符+重复次数”的形式,以点号 '.' 作为字符串结束标志。但代码中存在逻辑错误,导致输出结果不正确。

主要问题在于数组 A 和 B 的索引管理不匹配,以及初始赋值和循环逻辑有误。

- 数组 A 用来记录每个字符连续出现的次数,数组 B 用来记录对应的字符。但代码中 A 的索引 m 和 B 的索引 m 没有同步更新,导致次数和字符对应错位。
- 循环中处理连续字符时,A[m] 的累加和 B[m] 的赋值时机需要重新考虑,特别是当字符变化时,应该先保存前一个字符及其次数,再开始计数新字符。
- 另外,循环结束后最后一个字符的处理方式也需要调整,当前代码中 B[m] = c 的赋值可能覆盖了正确位置。