请进来看我的程序,题目为:输入一个字符串,内有数字和非数字字符。

2024-10-31 21:28:15
推荐回答(3个)
回答1:

#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");
}

回答2:

你在程序中用a[j]寻址原始字符串的当前字符位置,但在保存时也用j作为下标寻址b数组,这样就会出问题,建议修改b[i][j]=a[j];为b[i][j-k]=a[j];

回答3:

按照所给程序的原风格,略作修改的代码如下,经编译通过:
#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 puts(b[i]);

return 0;
}