#include
#include
#define MAX_LONG 100 // 假设字符串最长为100
#define MAX_DIGITS 20 // 假设最多有20组数字
static int digits[MAX_DIGITS]; //定义静态全局数组用于存放数字
static int index=0; //记录有效数字的组数
void get_digits(char a[],int len)
{
int i,j,k,dig,e,m;
i=j=k=dig=e=m=0;
while (i<=len-1)
{
if((a[i]>='0')&&(a[i]<='9')) // 判断是否是数字
j++;// 记住它有几个数字
else{
if(j>0) // 说明前面有数字未处理
{
dig=a[i-1]-48; // -48是将ASCII码转换成实际的数字
k=1; // 假设前面仅有一个数字
while (k{
e=1;
for(m=1;m<=k;m++) // 指数倍增(即十\百\千\万 etc)
e*=10;
dig+=((a[i-1-k]-48)*e);
k++;
}
digits[index++]=dig; // 将有效数字存入数组
j=0; // 重置j为下次查找数字做准备工作
}
}
i++; // 向后挪动
}
// 处理手尾工作,防止尾部有遗漏的数字
if(j>0)
{
dig=a[i-1]-48;
k=1; // 假设仅有一个数字
while(k{
e=1;
for(m=1;m<=k;m++)
e*=10; // 指数倍增
dig+=((a[i-1-k]-48)*e);
k++;
}
digits[index]=dig;
j=0;
}
}
void main()
{
char target[MAX_LONG];
printf("输入一串字符:");
scanf("%s",target);
get_digits(target,strlen(target));
for(int i=0;i<=index;i++) printf("%d ",digits[i]);
printf("\n");
}
你在程序中用a[j]寻址原始字符串的当前字符位置,但在保存时也用j作为下标寻址b数组,这样就会出问题,建议修改b[i][j]=a[j];为b[i][j-k]=a[j];
按照所给程序的原风格,略作修改的代码如下,经编译通过:
#include
#include
void main()
{
int i,j,n,k=0;
char a[30]={'\0'},b[30][20]={'\0'};
printf("输入一串字符\n");
scanf("%s",a);
for(i=0;i
n=0;
b[k][0]=0;
for(j=i;a[j]<='9'&&a[j]>='0';j++)
{
b[k][n++]=a[j];
b[k][n]=0;
}
if(n)k++,i+=n;
}
for(i=0;i
return 0;
}