[算法问题] 字符串提取
现要设计以服务器对 客户端的请求进行处理,遇到一个问题是 客户端发的指令不是等长的,想听听各位有什么高见,如何处理如下字符串指令?
格式: *系统号(一个定值),ID,U(定值),指令类型,参数1,...(参数个数不确定)#
(1)*JK, 1001, U, S1#
(2)*JK, 1003, U, S14, 参数1#
(3) *JK, 1004, U, S17, 参数1,参数2,参数3#
自己的初步想法是 将 *...#中的内容提出去,将里面的内容,按逗号分开后放入一结构体中,通过指令类型,来处理,(具体的指令参数个数 是确定的)不知道大家怎样处理?
还请大家 贴代码 赐教,谢谢啊 算法 字符串提取
[解决办法]
#include <stdio.h>
#include <string.h>
//格式: *系统号(一个定值),ID,U(定值),指令类型,参数1,...(参数个数不确定)#
#define MAXPN 10 //参数最多个数
#define MAXPW 8 // 参数最宽字符数
#define MAXPWQ "8" //"参数最宽字符数"
#define MAXL 110 // 指令类型及其后面内容最多字符数
#define MAXLQ "110" //"指令类型及其后面内容最多字符数"
struct CMD {
char sysno[3];
int id;
char u;
char type[4];
int pn;//参数个数
char pars[MAXPN][MAXPW];
} cmd[3];
int i=0,j;
void parse(char *s) {
char *p;
int n;
char q[MAXL+1],c;
if (i>=3) return;
p=s;
if (5!=sscanf(p,"*%2[^,], %d, %c, %"MAXLQ"[^#,]%c%n",cmd[i].sysno,&cmd[i].id,&cmd[i].u,q,&c,&n)) {
printf("Format Error:[%s]!\n",s);
return;
}
if ('#'==c) {
strncpy(cmd[i].type,q,3);cmd[i].type[3]=0;
cmd[i].pn=0;
i++;
} else if (','==c) {
strncpy(cmd[i].type,q,3);cmd[i].type[3]=0;
p+=n;
for (j=0;j<MAXPN;j++) {
if (2!=sscanf(p,"%"MAXPWQ"[^#,]%c%n",cmd[i].pars[j],&c,&n)) {
printf("Format Error:[%s]!\n",s);
return;
}
if ('#'==c) {
cmd[i].pn=j+1;
i++;
return;
} else if (','==c) {
p+=n;
}
}
i++;
return;
} else {
printf("Format Error:[%s]!\n",s);
return;
}
}
int main() {
int cn;
parse("*JK, 1001, U, S1#");
parse("*JK, 1003, U, S14, 参数1#");
parse("*JK, 1004, U, S17, 参数1, 参数2, 参数3#");
cn=i;
for (i=0;i<cn;i++) {
printf("*%s, %d, %c, %s",cmd[i].sysno,cmd[i].id,cmd[i].u,cmd[i].type);
for (j=0;j<cmd[i].pn;j++) printf(", %s",cmd[i].pars[j]);
printf("#\n");
}
return 0;
}
//*JK, 1001, U, S1#
//*JK, 1003, U, S14, 参数1#
//*JK, 1004, U, S17, 参数1, 参数2, 参数3#
//