Online Compiler C

#include <stdio.h> int main() { char s[1001] = {0}; fgets(s, sizeof(s), stdin); 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),即把连续相同的字符压缩成“字符+重复次数”的形式。例如输入 "aaabbbcc" 应输出 "a3b3c2"。

代码的逻辑存在几个问题:

- 变量 `c` 在每次循环末尾被更新为 `s[i]`,但循环开始时 `c` 已经保存了前一个字符,而 `count` 的计数逻辑与字符切换的判断时机不匹配,导致第一个字符的处理可能出错。
- 循环内部对 `s[i+1]` 的判断放在循环末尾,但此时 `c` 已经被更新,导致结尾处理时使用的 `c` 可能不是当前正在计数的字符。
- 当遇到不同字符时,代码输出的是旧的 `c` 和 `count`,但随后立即将 `c` 更新为新的字符,而 `count` 重置为1,这个顺序是正确的,但需要确保在输出时 `c` 还没有被覆盖。

- 检查循环开始时 `c` 的初始值:`c = s[0]`,但循环从 `i=0` 开始,第一次迭代时 `s[i]` 等于 `c`,所以 `count` 会从0增加到1。但之后遇到不同字符时,输出的是旧的 `c`,而旧的 `c` 在第一次迭代后已经被更新为 `s[0]`,所以实际上第一个字符的计数可能被错误地包含在后续输出中。
- 考虑在循环外部先处理第一个字符,或者调整循环的起始索引和 `c` 的更新时机,使得每个字符的计数和输出逻辑更清晰。