在线编译器 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]); } } printf("%c",s[i]); } } int main() { char m[1000]; scanf("%[^\n]", m); // printf("%s",m); num(m); return 0; }
这段代码试图实现一个功能:读取一行字符串,然后对其中每个数字字符进行某种处理。但代码存在逻辑错误,目前无法正确运行。

`num` 函数正确计算了字符串长度。`same` 函数是核心处理部分,但它的逻辑有问题。

- 在 `same` 函数中,你检查 `s[i] > 0 && s[i] <= 9`,但字符 '0' 到 '9' 的 ASCII 码是 48 到 57,不是 0 到 9。所以这个条件永远不会成立,数字字符不会被识别。
- 当条件成立时,你试图用 `while(b[i] > 0)` 循环打印 `s[i-1]`,但 `b[i]` 存储的是字符的 ASCII 值(比如 '5' 是 53),这个循环会无限执行,因为 `b[i]` 不会减少。而且打印 `s[i-1]` 可能不是你想要的效果。

提示:
- 检查字符是否为数字时,应该用字符比较,比如 `s[i] >= '0' && s[i] <= '9'`。
- 思考一下,当遇到数字字符时,你真正想做什么操作?是重复打印前一个字符,还是其他?循环条件需要仔细设计,避免无限循环。