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;
}
[解决办法]
没什么意思,直接找=即可,从=往左右走到空白字符停止就得到结果了。比分字段什么的都要高效,代码量也少的可怜。
[解决办法]