Онлайн компилятор C

#include <stdio.h> int main() { char s[1001] = {0}; scanf("%s", s); char c = s[0]; int count = 0; for (int i = 0; s[i] != '\0'; i++) { if (s[i] == c) count++; else if (s[i] != c) { if (count > 1) printf("%c%d", c, count); else printf("%c", c); count = 1; } c = s[i]; if (s[i + 1] == '\0') { if (count > 1) printf("%c%d", c, count); else printf("%c", c); } } return 0; }
这段代码试图实现字符串的游程编码(Run-Length Encoding),将连续重复的字符压缩成“字符+重复次数”的形式。例如输入 "aaabbbcca" 应输出 "a3b3c2a"。

代码逻辑存在几个问题:

- 在循环中,每次迭代都会更新 `c = s[i]`,但 `c` 原本用于记录当前正在计数的字符。当遇到不同字符时,应该先输出前一个字符及其计数,然后重置 `c` 为新的字符,但代码在输出后立即将 `c` 更新为当前字符,导致后续判断混乱。

- 循环末尾处理字符串结束的逻辑可以合并到循环内部,避免重复代码。

- 变量 `count` 的初始值应为 1,因为第一个字符已经出现一次,但代码中初始化为 0,导致计数少 1。

- 当遇到不同字符时,`else if (s[i] != c)` 这个条件多余,因为 `else` 已经隐含了不相等的情况。

- 输出格式中,当计数为 1 时只输出字符,但代码中 `printf("%c", c)` 正确,不过需要确保 `c` 在此时是正确的前一个字符。

- 循环结束后,最后一个字符的处理逻辑与循环内重复,可以简化。

- 注意 `scanf("%s", s)` 不会读取空格,如果输入包含空格会截断。