日期:2014-05-16  浏览次数:20986 次

如何将字符串拆分并存入结构体?
麻烦各位帮忙看看
现在有字符串数组{ "123|abc|111|aaa|222|bbb|333|ccc "},该如何将字符串拆分并存入一个成员包含ID和name的结构体?
期望实现:1.字符串以 "| "拆分,每遇到一次即将 "| "之前的字符存入结构体;2.结构体形式最好是动态链表结构;3.希望能有较详细的程序及注释说明。

------解决方案--------------------
给你点提示吧。
字符串的拆分你仔细看看string.h头文件,里面有函数可以查找某个字符的,如: '| '。所以你只要用两个整形变量记住每次查找的起始位置和找到的终止位置就可以实现拆分了,至于结构体中要有链表结构,这个就是维护一个指针的问题,一般的C语言书上都有代码的啊,这个不难。
这个代码很简单,还是自己练练手吧。
------解决方案--------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct aa{ //定义一个结构体
char id[10];
char name[10];
char buf[10][10];
int i;
struct aa *next;
};


int main()
{
char buf[]= "123|abc|111|aaa|222|bbb|333|ccc "; //待分割的字符串
char *delim= "| " ;//分割符
char *ptr=NULL,*str=NULL,tmpbuf[128];
int i=0,num=10;
struct aa *aa_ptr=NULL,*aa_head=NULL,*aa_tail=NULL;
for(i=0;i <10;i++)
{
memset(tmpbuf,0,sizeof(tmpbuf));
strcpy(tmpbuf,buf); //把待分割的数据放入一个临时变量内,因为有些分割函数会改变待分割的数据内容.
ptr=tmpbuf;
num=0;
aa_ptr=(struct aa *)malloc(sizeof(struct aa)); //分配一个结构体
memset(aa_ptr,0,sizeof(struct aa)); //把结构体内的数据全部情况
aa_ptr-> i=i; //
while((str=strtok(ptr,delim))!=NULL) //以delim为分割符,分割字符串
{
if(num==0) //如果是第一个数据,放入id内
strcpy(aa_ptr-> id,str);
else if(num==1) //如果是第二个数据,放入name内
strcpy(aa_ptr-> name,str);
else strcpy(aa_ptr-> buf[num-2],str); //其它的放入buf内,
num++; //计数器改变
ptr=NULL; //strtok函数的使用方法是,第一此使用时,把待分割的字符串传进去,再使用时,strtok(NULL,delim)就行了
}
if(!aa_head)aa_head=aa_ptr; //如过,头指针是空的,即是第一个结构体,则头指针指向它
if(aa_tail)aa_tail-> next=aa_ptr; //如果尾指针不空,即现在不是第一个结构体,则把当前的结构体链如到尾部.
aa_tail=aa_ptr; //尾指针后移.
}

aa_ptr=aa_head;//当前指针指向链表的头部.
while(aa_ptr) //循环输出,并释放结构体
{
printf( " %d id=%s,name=%s,other %s,%s,%s,%s,%s,%s\n ",aa_ptr-> i,aa_ptr-> id,aa_ptr-> name,aa_ptr-> buf[0],aa_ptr-> buf[1],aa_ptr-> buf[2],aa_ptr-> buf[3],aa_ptr-> buf[4],aa_ptr-> buf[5]);
//输出数据
aa_head=aa_ptr-> next; //头指针下移
free(aa_ptr); //释放当前结构体
aa_ptr=aa_head; //当前结构体指向头部.
}

//另外一种分割方法.
char a[10],b[10],c[10],d[10],e[10],f[10],g[10],h[10];
memset(a,0,10);
memset(b,0,10);
memset(c,0,10);
memset(d,0,10);
memset(e,0,10);
memset(f,0,10);
memset(g,0,10);
memset(h,0,10);
sscanf(buf, "%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|] ",a,b,c,d,e,f,g,h);
printf( "%s,%s,%s,%s,%s,%s,%s,%s\n ",a,b,c,d,e,f,g,h);
}