Онлайн компилятор 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("%c",s[i-1]); b[i]--; } } else printf("%c",s[i]); } } int main() { char m[1000]; scanf("%[^\n]", m); // printf("%s",m); same(m); return 0; }
这段代码的功能是:读取一行字符串,然后遍历每个字符。如果遇到数字字符('1'到'9'),就把它前面的那个字符重复打印(数字的值减1次)。例如输入"a3b2",会输出"aaabb"。

代码中有一个潜在的错误。当字符串的第一个字符是数字时,比如输入"3a",程序会尝试访问s[i-1],也就是s[-1],这是数组越界,会导致未定义行为。

- 检查当数字出现在字符串开头时,你的代码会如何处理。考虑一下,如果数字前面没有字符,应该怎么做?
- 另外,你的数字判断条件用了s[i]>48,这排除了数字'0'(ASCII 48)。想一想,如果输入包含'0',你希望程序做什么?