在线编译器 C

#include <stdio.h> void pack_string(char s[]){ int sum=1,num=s[0],i=1; while(s[i]!='\0'){ if(s[i]==num){ sum++; num=s[i]; }else { printf("%d%c",sum,num); sum=1; num=s[i]; }i++; } } int main() { char a[1000]; for(int i=0;i<1000;i++){ scanf("%c",&a[i]); } pack_string(a); return 0; }
这段代码试图实现一个字符串的“游程编码”(Run-Length Encoding),即把连续相同的字符压缩成“次数+字符”的形式。但代码中存在几个问题。

- 你使用 `num=s[0]` 来存储当前字符,但 `num` 是 `int` 类型,而字符应该用 `char` 类型。这会导致比较和输出时出现类型不匹配的问题。
- 循环结束后,最后一个字符组没有被输出。因为 `while` 循环只在遇到 `'\0'` 时退出,但退出前没有打印最后一组统计结果。
- 主函数中,你试图用 `for` 循环读取1000个字符,但这样会读取包括换行符在内的所有字符,而且如果输入少于1000个字符,程序会一直等待。更常见的是用 `fgets` 或 `scanf` 配合 `%s` 读取一个字符串。

- 检查 `num` 的类型,应该用 `char` 来存储字符,而不是 `int`。
- 在 `while` 循环结束后,需要再输出一次最后一组字符的统计结果。