字符串分割转数字

需求:"SSTC01#99810#CST#334#55#2#CST#88" 如这样一串字符串,假定他是某种自定义传输协议中的格式,指令码通过#分割;现需求有指令码的第一节字符串不要,如上SSTC01不要,并且后续指令码如出现含字母指令码也不要,只需获取数字并输出为整型数值,如上面字符串需要获取[99810,334,55,2,88],并且字符串中的指令码支持可变长度,指令码个数也需要支持可变长度。

long *final(char *,int *);

void main(void) {
  char str[]="SSTC01#99810#CST#334#55#2#CST#88#13#456#4444#3333#134567#";	
  long *p;
  int i=0,num=0;       //num为获取二维的行数 
  p=final(str,&num);
  //处理后的存储结构p[][]={"99810","334","55","2","88"} 
  for(;i<num;i++)
    printf("%ld\r\n",p[i]);
}

long *final(char *str,int *Num)
{
  char **buffer;
  long  *buf;
  char *p,*q;  //p,q指针都指向待处理字符串 
  int c=0,sp=0,i=0,max=0,count=0;
  //sp为分割有多少节数字字符串
  //分配内存时for循环使用
  //max存储数字中最长的一节
  //count存储二位每节数字的每位时移位用 
  p=str;  //p用于分割存储时用 
  q=str;  //q用于待处理字符串结构长度用 
  while(*q!='\0')
  {
    if(*q=='#')
    {
      *q++;
      while(*q >= '0'&& *q <= '9')
      {
        c++;
        *q++;
        if(*q=='#' || *q=='\0')
        {
          if(c>=max)
          {max=c;}
          c=0;
          sp++;
          *q++;	
        }
      }	
    }
    *q++;
  }
  printf("%d\r\n",max);
  buffer=(char **)calloc(sp+1,sizeof(char *));
  buf=(long *)calloc(sp+1,sizeof(long));
  for(i=0;i<sp+1;i++)
    buffer[i]=(char *)calloc(max,sizeof(char *));
  sp=0;    //复位sp 
  while(*p!='\0')
  {
    if(*p=='#')
    {
      *p++;
      while(*p >= '0'&& *p <= '9')
      {
        buffer[sp][count++]=*p++;
        if(*p=='#')
        {
          sp++;*p++;count=0;
        }	
      }
    }
    *p++;
  }
  *Num=sp+1; //将分割后的数字串个数返回 	
  for(i=0;i<sp+1;i++)
    buf[i]=atoi(buffer[i]);
  
  return buf;  					
}

最后,该程序还有一个问题待解决,就是动态创建内存后,内存释放的问题,在final函数中,如果释放了内存则无法返回数据。如果有好的方法,可以留言哦。

点赞