Online Compiler C

#include <stdio.h> int main() { char s[1001]; int n = 0; int x = 1; while ((s[n] = getchar()) != EOF) { n++; } scanf("%[^\n]", s); for (int i = 0; i < n; i++) { while (s[i + 1] == s[i]) { x++; i++; } while (s[i + 1] != s[i]) { i++; } if (x == 1) printf("%c", s[i]); else printf("%c%d", s[i], x); } return 0; }
这段代码试图实现一个简单的“游程编码”(Run-Length Encoding),将连续重复的字符压缩成“字符+重复次数”的形式。但代码中存在逻辑错误,导致无法正确输出结果。

- 第一个 `while` 循环从标准输入读取字符直到 EOF,但紧接着又用 `scanf` 再次读取输入,这会覆盖之前读取的内容,导致 `n` 的值与 `s` 中的实际字符数不匹配。
- 内层的两个 `while` 循环逻辑混乱:第一个 `while` 试图统计连续相同字符的个数,但第二个 `while` 会跳过所有不同的字符,导致循环变量 `i` 的移动方式不正确,无法正确遍历字符串。

- 检查输入读取部分:你只需要一种方式读取输入,不要同时使用 `getchar` 和 `scanf`。思考如何只用一个循环读取整行输入(包括空格),并正确记录字符个数。
- 重新设计压缩逻辑:用一个变量记录当前字符的重复次数,当遇到不同字符时输出结果并重置计数器。注意循环中 `i` 的移动要清晰,避免嵌套 `while` 造成混乱。