Online Compiler C

#include <stdio.h> int main() { char s[1001], t[1001]; int len = 0; 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]) { printf("%c",s[i]);} while (s[i + 1] == s[i]) { x++; } printf("%c%d",s[i],x) } return 0; }
这段代码试图实现一个“游程编码”功能:将连续重复的字符压缩成“字符+重复次数”的形式。但代码存在多个问题,导致无法正确运行。

首先,代码中两次读取输入:第一次用 `getchar()` 循环读取直到 EOF,第二次又用 `scanf` 读取一行。这会导致输入被覆盖或混乱,而且 `n` 记录的是第一次读取的字符数,但实际处理时却使用了第二次读取的字符串 `s`,两者不匹配。

其次,内部的 `while` 循环逻辑有误。例如 `while (s[i + 1] != s[i])` 会陷入死循环,因为当条件成立时,循环体没有改变 `i` 或 `s` 的内容,会一直打印同一个字符。同样,`while (s[i + 1] == s[i])` 也缺少对 `i` 的更新,导致无限循环。

另外,`printf("%c%d",s[i],x)` 缺少分号,这是语法错误。

- 提示1:先确定只使用一种输入方式,要么用 `getchar` 循环读取,要么用 `scanf` 读取一行,不要混用。并且确保读取后字符串的长度 `n` 与后续循环一致。
- 提示2:在遍历字符串时,不要用 `while` 循环去判断相邻字符是否相等,而是用 `for` 循环配合一个计数器来统计连续相同字符的个数,并在字符变化时输出。注意每次输出后要重置计数器。