Онлайн компилятор 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]; } if (time == 1) { printf("%c1",s[0]); return; } 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]++; B[m] = s[i-1]; } else { B[m]= s[i-1]; m++; } } 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; }
这段代码的目标是对字符串进行“行程长度编码”,即把连续相同的字符压缩成“字符+重复次数”的形式,并以句点作为结束标志。但代码中存在逻辑错误,导致输出结果不正确。

- 在统计连续字符时,数组 `A` 和 `B` 的索引 `m` 更新逻辑有问题。当遇到相同字符时,只增加了 `A[m]`,但没有更新 `B[m]`;当遇到不同字符时,才更新 `B[m]` 并增加 `m`。这会导致 `B` 中存储的字符与 `A` 中计数的位置不匹配,而且最后一个字符的处理方式也可能出错。

- 另外,变量 `c` 在循环结束后保存的是最后一个字符,但用它来填充 `B[m]` 可能不是正确的逻辑,因为最后一个字符可能已经被前面的分支处理过。