Online Compiler C

#include <stdio.h> void result(char c[]) { int i = 0; int counter = 1; while (c[i] != '\0') { if (c[i] == c[i + 1] && c[i + 1] != '\0') { counter++; } else { printf("%c%d", c[i], counter); counter = 1; } i++; } } int main() { char a[1001]; scanf("%[^\n]", a); result(a); return 0; }
这段代码实现了一个简单的“游程编码”功能:将连续重复的字符压缩成“字符+重复次数”的形式输出。例如输入"aaabbbcc"会输出"a3b3c2"。

代码逻辑基本正确,但有一个边界情况需要留意。

- 当输入字符串末尾有连续重复字符时,循环结束后不会输出最后一组字符的计数。例如输入"aa",循环中第一次遇到c[0]==c[1]时counter变成2,然后i=1时c[1]!='\0'但c[1]!=c[2](因为c[2]是'\0'),此时会输出"a2",看起来没问题。但如果输入只有单个字符如"a",循环中c[0]!='\0',c[0]!=c[1](c[1]是'\0'),会输出"a1",也正确。所以这个边界情况其实已经处理了。

- 更关键的问题在于:当输入字符串末尾有连续重复字符且字符串长度正好是1000时,数组a[1001]的最后一个元素是a[1000],但scanf读取时如果输入正好1000个字符,则a[1000]会被赋值为'\0',此时循环中访问c[i+1]时i最大为999,c[1000]是'\0',不会越界。但如果输入超过1000个字符,则数组越界,但题目限制数组大小为1001,所以这不是代码本身的问题。

实际上这段代码在逻辑上没有明显错误。但有一个潜在问题:当输入字符串为空(直接按回车)时,scanf会读取到换行符,但格式"%[^\n]"会匹配失败,a数组内容未定义,可能导致意外输出。