在线编译器 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; 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("%s%d", B[i], A[i]); } } int main() { char a[1000]; scanf("%s", a); pack_string(a); return 0; }
这段代码试图实现字符串的“游程编码”(Run-Length Encoding),即把连续相同的字符压缩成“字符+重复次数”的形式。例如 "aaabb." 应输出 "a3b2"。但代码存在逻辑错误,无法正确输出。

- 第一个循环计算字符串长度(遇到 '.' 停止),但 '.' 本身不应被编码,且循环结束后 `c` 只保存了最后一个非 '.' 字符。
- 第二个循环初始化计数数组 `A` 全为1,但 `m` 的递增逻辑有误:当遇到不同字符时,`m` 才增加,但 `B[m]` 的赋值位置和 `A[m]` 的累加位置不匹配,导致计数和字符错位。
- 最后 `printf` 使用 `%s` 打印单个字符,这是错误的,应该用 `%c`。