Онлайн компилятор 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]; while(b[i]>48){ 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; }
这段代码试图实现一个功能:读取一行字符串,然后对其中每个数字字符,将其前面的字符重复输出(数字的值减去48次)。但代码中存在逻辑错误。

- 函数 `num` 正确计算了字符串长度。
- 函数 `same` 中,`b[i]` 存储的是字符的ASCII码,但条件 `s[i]>48&&s[i]<=57` 只判断了数字1-9,没有包含数字0(ASCII 48)。同时,循环内对 `b[i]` 进行递减并输出 `s[i-1]`,这会导致重复输出前一个字符,但逻辑有误。

- 主要问题:当遇到数字时,你希望输出前一个字符若干次,但当前代码在每次递减时都输出 `s[i-1]`,并且之后还会执行 `printf("%c",s[i])` 输出数字本身,这不符合预期。另外,数字0没有被处理。

- 提示1:仔细思考数字字符的含义。例如字符'3'的ASCII是51,减去48得到数值3。你目前用 `b[i]=s[i]` 存储了ASCII码,然后比较 `b[i]>48`,这相当于比较ASCII码是否大于48,而不是比较数值。应该先将字符转换为对应的整数值。

- 提示2:当遇到数字时,你希望重复输出它前面的字符,但当前代码在循环内同时输出了前一个字符和当前数字。考虑如何控制输出顺序:是先输出前一个字符重复若干次,然后跳过当前数字不输出,还是其他方式?注意当前循环最后一行 `printf("%c",s[i])` 会输出所有字符,包括数字本身。