在线编译器 C

#include <stdio.h> int num(char *s){ int sum=0; while(*s!='\0'){ sum++; s++; } return sum; } void same(char *s) { int n=num(s); int b[1000]; for(int i=0;i<n;i++){ if(s[i]>48&&s[i]<=57){ b[i]=s[i]-48; while(b[i]>0){ printf("%d",s[i-1]); b[i]--; } } printf("%c",s[i]); } } int main() { char m[1000]; scanf("%[^\n]", m); // printf("%s",m); num(m); return 0; }
这段代码试图实现一个功能:读取一个字符串,当遇到数字字符时,将数字前面的字符重复打印该数字次。但代码存在逻辑错误。

- 函数 `num` 正确计算了字符串长度。
- 函数 `same` 中,当遇到数字字符时,你试图用 `b[i]` 存储数字值,然后循环打印前一个字符。但这里有两个问题:第一,数字字符本身也会被后面的 `printf("%c",s[i])` 打印出来;第二,循环中 `s[i-1]` 可能访问越界(当 i=0 时)。

- 你的思路是:遇到数字就重复打印它前面的字符。但当前代码在打印完重复字符后,又打印了数字本身,这不符合预期。另外,数字字符的判断条件 `s[i]>48 && s[i]<=57` 排除了字符 '0'(ASCII 48),但 '0' 也是数字。

- 主函数中调用了 `num(m)` 但没有使用返回值,这行代码没有实际作用。

- 提示:
  - 当遇到数字字符时,应该跳过打印该数字本身,只打印它前面的字符重复指定次数。
  - 注意处理边界情况,比如字符串开头就是数字的情况。