读书人

c语言拆分字符串,该怎么解决

发布时间: 2012-08-22 09:50:34 作者: rapoo

c语言拆分字符串
1.已知字符串“-c DateStyle=iso -c timezone=prc -c geqo=on -c intervalstyle=postgres -c lc_monetary=C -c search_path=$user,public -c work_mem=1024 -c xx=xx .....” ,字符串长度是变化的
2.已知结构体
typedef struct pgoptions
{
const char*name;
char*value;
struct pgoptions*next;
}Option;
要求把这个字符串拆分了存入结构体,例如-c DateStyle=iso拆分后name即为DateStyle,value为iso。
求最简单的方法,先答者给高分。我也写下,最后对比下



[解决办法]
这个其实就是命令行参数的解析,我们完全不用自己写命令行参数解析器,只要使用getopt()和getopt_long()这两个函数就可以啦,可以参考http://www.51testing.com/?uid-225738-action-viewspace-itemid-225327所讲的用法。
[解决办法]
仅供参考

C/C++ code
#include <stdio.h>#include <string.h>char string[80];char seps1[3];char seps2[3];char *token;char *zzstrtok (    char *string,    const char *control1,//连续出现时视为中间夹空token    const char *control2 //连续出现时视为中间无空token    ){    unsigned char *str;    const unsigned char *ctrl1 = (const unsigned char *)control1;    const unsigned char *ctrl2 = (const unsigned char *)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=(unsigned char *)string;    }    else str=(unsigned char *)nextoken;    string=(char *)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=(char *)str;                flag=0;            } else if (map2[*str >> 3] & (1 << (*str & 7))) {                str++;                string=(char *)str;            } else {                string=(char *)str;                str++;                flag=1;            }        }    }    nextoken=(char *)str;    if (string==(char *)str) return NULL;    else             return string;}void main(){   strcpy(string,"A \tstring\t\tof ,,tokens\n\nand some  more tokens, ");   strcpy(seps1,",\n");strcpy(seps2," \t");   printf("\n[%s]\nTokens:\n",string);   token=zzstrtok(string,seps1,seps2);   while (token!=NULL) {      printf(" <%s>",token);      token=zzstrtok(NULL,seps1,seps2);   }   strcpy(string,"1234| LIYI|China | 010 |201110260000|OK");   strcpy(seps1,"|");strcpy(seps2," ");   printf("\n[%s]\nTokens:\n",string);   token=zzstrtok(string,seps1,seps2);   while (token!=NULL) {      printf(" <%s>",token);      token=zzstrtok(NULL,seps1,seps2);   }   strcpy(string,"1234|LIYI||010|201110260000|OK");   strcpy(seps1,"");strcpy(seps2,"|");   printf("\n[%s]\nTokens:\n",string);   token=zzstrtok(string,seps1,seps2);   while (token!=NULL) {      printf(" <%s>",token);      token=zzstrtok(NULL,seps1,seps2);   }   strcpy(string,"1234|LIYI||010|201110260000|OK");   strcpy(seps1,"|");strcpy(seps2,"");   printf("\n[%s]\nTokens:\n",string);   token=zzstrtok(string,seps1,seps2);   while (token!=NULL) {      printf(" <%s>",token);      token=zzstrtok(NULL,seps1,seps2);   }   strcpy(string,"a");   strcpy(seps1,",");strcpy(seps2,"");   printf("\n[%s]\nTokens:\n",string);   token=zzstrtok(string,seps1,seps2);   while (token!=NULL) {      printf(" <%s>",token);      token=zzstrtok(NULL,seps1,seps2);   }   strcpy(string,"a,b");   strcpy(seps1,",");strcpy(seps2,"");   printf("\n[%s]\nTokens:\n",string);   token=zzstrtok(string,seps1,seps2);   while (token!=NULL) {      printf(" <%s>",token);      token=zzstrtok(NULL,seps1,seps2);   }   strcpy(string,"a,,b");   strcpy(seps1,",");strcpy(seps2,"");   printf("\n[%s]\nTokens:\n",string);   token=zzstrtok(string,seps1,seps2);   while (token!=NULL) {      printf(" <%s>",token);      token=zzstrtok(NULL,seps1,seps2);   }   strcpy(string,",a");   strcpy(seps1,",");strcpy(seps2,"");   printf("\n[%s]\nTokens:\n",string);   token=zzstrtok(string,seps1,seps2);   while (token!=NULL) {      printf(" <%s>",token);      token=zzstrtok(NULL,seps1,seps2);   }   strcpy(string,"a,");   strcpy(seps1,",");strcpy(seps2,"");   printf("\n[%s]\nTokens:\n",string);   token=zzstrtok(string,seps1,seps2);   while (token!=NULL) {      printf(" <%s>",token);      token=zzstrtok(NULL,seps1,seps2);   }   strcpy(string,",a,,b");   strcpy(seps1,",");strcpy(seps2,"");   printf("\n[%s]\nTokens:\n",string);   token=zzstrtok(string,seps1,seps2);   while (token!=NULL) {      printf(" <%s>",token);      token=zzstrtok(NULL,seps1,seps2);   }   strcpy(string,",,a,,b,,");   strcpy(seps1,",");strcpy(seps2,"");   printf("\n[%s]\nTokens:\n",string);   token=zzstrtok(string,seps1,seps2);   while (token!=NULL) {      printf(" <%s>",token);      token=zzstrtok(NULL,seps1,seps2);   }   strcpy(string,",");   strcpy(seps1,",");strcpy(seps2,"");   printf("\n[%s]\nTokens:\n",string);   token=zzstrtok(string,seps1,seps2);   while (token!=NULL) {      printf(" <%s>",token);      token=zzstrtok(NULL,seps1,seps2);   }   strcpy(string,",,");   strcpy(seps1,",");strcpy(seps2,"");   printf("\n[%s]\nTokens:\n",string);   token=zzstrtok(string,seps1,seps2);   while (token!=NULL) {      printf(" <%s>",token);      token=zzstrtok(NULL,seps1,seps2);   }   strcpy(string,",,,");   strcpy(seps1,",");strcpy(seps2," ");   printf("\n[%s]\nTokens:\n",string);   token=zzstrtok(string,seps1,seps2);   while (token!=NULL) {      printf(" <%s>",token);      token=zzstrtok(NULL,seps1,seps2);   }}////[A      string          of ,,tokens////and some  more tokens,]//Tokens:// <A>, <string>, <of>, <>, <tokens>, <>, <and>, <some>, <more>, <tokens>, <>,//[1234| LIYI|China | 010 |201110260000|OK]//Tokens:// <1234>, <LIYI>, <China>, <010>, <201110260000>, <OK>,//[1234|LIYI||010|201110260000|OK]//Tokens:// <1234>, <LIYI>, <010>, <201110260000>, <OK>,//[1234|LIYI||010|201110260000|OK]//Tokens:// <1234>, <LIYI>, <>, <010>, <201110260000>, <OK>,//[a]//Tokens:// <a>,//[a,b]//Tokens:// <a>, <b>,//[a,,b]//Tokens:// <a>, <>, <b>,//[,a]//Tokens:// <>, <a>,//[a,]//Tokens:// <a>, <>,//[,a,,b]//Tokens:// <>, <a>, <>, <b>,//[,,a,,b,,]//Tokens:// <>, <>, <a>, <>, <b>, <>, <>,//[,]//Tokens:// <>, <>,//[,,]//Tokens:// <>, <>, <>,//[,,,]//Tokens:// <>, <>, <>, <>, 


[解决办法]
void jiexi(const char* str,Option *a)
{
char temp1[N],temp2[N];
int num=0;
char *p,*q;
for(q=str;*q!='=';q++)
if(*q==' ')
p=q;
p++;
while(p!=q)
temp1[num++]=*p++;
temp1[num]='\0';
(*a).name=temp1;
num=0;
q++;
while(*q!='\0')
temp2[num++]=*q++;
temp2[num]='\0';
(*a).value=temp2;
}
[解决办法]
没什么意思,直接找=即可,从=往左右走到空白字符停止就得到结果了。比分字段什么的都要高效,代码量也少的可怜。
[解决办法]

探讨

引用:

没什么意思,直接找=即可,从=往左右走到空白字符停止就得到结果了。比分字段什么的都要高效,代码量也少的可怜。

恩,大神的说法很对,我马上来这样实现下。
还请教一个问题,像我这样的链表中存了很多键值了,有没有快速查找的方法。例如我存了接近100个,我要查找其中name为我期望的那个

读书人网 >C语言

热点推荐