Online Compiler 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]>'0'&&s[i]<='9'){ b[i]=s[i]; 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; }
这段代码试图实现一个功能:读取一行字符串,然后对其中每个数字字符,将其前面的字符重复输出(数字的值减1次)。但代码存在逻辑错误。

- 函数 `num` 正确计算了字符串长度。
- 函数 `same` 中,`b[i]=s[i]` 将字符的ASCII码赋值给整数数组,而不是数字本身的值。例如字符 `'3'` 的ASCII码是51,而不是3。
- 循环 `while(b[i]>'0')` 比较的是ASCII码,导致条件判断错误。
- 输出 `s[i-1]` 时,当 `i=0` 会访问数组越界。

- 提示1:检查如何将数字字符转换为它代表的整数值,例如字符 `'5'` 如何变成数字5。
- 提示2:注意循环边界条件,当 `i=0` 时访问 `s[i-1]` 会导致问题,需要处理这种情况。