需求:"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函数中,如果释放了内存则无法返回数据。如果有好的方法,可以留言哦。