首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

[算法有关问题] 字符串提取

2013-10-16 
[算法问题] 字符串提取现要设计以服务器对 客户端的请求进行处理,遇到一个问题是 客户端发的指令不是等长

[算法问题] 字符串提取
现要设计以服务器对 客户端的请求进行处理,遇到一个问题是 客户端发的指令不是等长的,想听听各位有什么高见,如何处理如下字符串指令?

格式:   *系统号(一个定值),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#
//

[解决办法]
如果指令给的规范些,用vector, string.find更简单

热点排行