读书人

string解决方法

发布时间: 2012-03-09 16:54:56 作者: rapoo

string
@header
@version1.1
@target_dataDB-110817M-030
@major_dataDB-110817M-030
@create_date20110825


怎么把 DB-110817M-030 到target_data 中间有好多空格的。 而且是循环的

[解决办法]

C/C++ code
#include <stdio.h>#include <string.h>char s[]="@header\n""@version 1.1\n""@target_data          DB-110817M-030\n""@major_data           DB-110817M-030\n""@create_date          20110825\n";char seps1[4];char seps2[4];char *token;char *zzstrtok (    char *string,    const char *control1,//连续出现时视为中间夹空token    const char *control2 //连续出现时视为中间无空token    ){    unsigned char *str;    const unsigned char *ctrl1 = control1;    const unsigned char *ctrl2 = control2;    unsigned char map1[32],map2[32];    static char *nextoken;    static char flag=0;    unsigned char c;    int L;    memset(map1,0,32);    memset(map2,0,32);    do {        map1[*ctrl1 >> 3] |= (1 << (*ctrl1 & 7));    } while (*ctrl1++);    do {        map2[*ctrl2 >> 3] |= (1 << (*ctrl2 & 7));    } while (*ctrl2++);    if (string) {        if (control2[0]) {            L=strlen(string);            while (1) {                c=string[L-1];                if (map2[c >> 3] & (1 << (c & 7))) {                    L--;                    string[L]=0;                } else break;            }        }        if (control1[0]) {            L=strlen(string);            c=string[L-1];            if (map1[c >> 3] & (1 << (c & 7))) {                string[L]=control1[0];                string[L+1]=0;            }        }        str=string;    }    else        str=nextoken;    string=str;    while (1) {        if (0==flag) {            if (!*str) break;            if (map1[*str >> 3] & (1 << (*str & 7))) {                *str=0;                str++;                break;            } else if (map2[*str >> 3] & (1 << (*str & 7))) {                string++;                str++;            } else {                flag=1;                str++;            }        } else if (1==flag) {            if (!*str) break;            if (map1[*str >> 3] & (1 << (*str & 7))) {                *str=0;                str++;                flag=0;                break;            } else if (map2[*str >> 3] & (1 << (*str & 7))) {                *str=0;                str++;                flag=2;                break;            } else str++;        } else {//2==flag            if (!*str) return NULL;            if (map1[*str >> 3] & (1 << (*str & 7))) {                str++;                string=str;                flag=0;            } else if (map2[*str >> 3] & (1 << (*str & 7))) {                str++;                string=str;            } else {                string=str;                str++;                flag=1;            }        }    }    nextoken=str;    if (string==str) return NULL;    else             return string;}int main() {   strcpy(seps1,"");strcpy(seps2,"@ \n");   printf("\n[%s]\nTokens:\n",s);   token=zzstrtok(s,seps1,seps2);   while (token!=NULL) {      printf("<%s>\n",token);      token=zzstrtok(NULL,seps1,seps2);   }}////[@header//@version 1.1//@target_data          DB-110817M-030//@major_data           DB-110817M-030//@create_date          20110825//]//Tokens://<header>//<version>//<1.1>//<target_data>//<DB-110817M-030>//<major_data>//<DB-110817M-030>//<create_date>//<20110825> 

读书人网 >C++

热点推荐