在线编译器 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]) { 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; }
这段代码试图实现一个字符串压缩功能,将连续相同的字符替换为“字符+重复次数”,但存在多个问题。

首先,代码先用一个循环从标准输入读取字符存入数组 `s`,直到遇到EOF。然后紧接着又用 `scanf("%[^\n]", s)` 再次读取输入,这会覆盖之前读取的内容,导致第一个循环读取的数据丢失。而且 `scanf` 会从缓冲区读取,可能读到空字符串或残留字符。

其次,内层两个 `while` 循环的逻辑有问题。第一个 `while` 统计连续相同字符的个数,但第二个 `while` 试图跳过不同字符,这会导致索引 `i` 的移动混乱,可能跳过字符或陷入死循环。另外,变量 `x` 没有在每次遇到新字符时重置,导致计数错误。

- 检查第一个循环和 `scanf` 的冲突:你实际上只需要一种输入读取方式,要么用 `getchar` 循环,要么用 `scanf`,不要同时使用。
- 检查内层循环的逻辑:统计连续相同字符时,通常用一个循环来计数,然后一次性输出字符和次数,再移动索引到下一个不同字符的位置。注意每次遇到新字符时,计数变量要重置为1。