C语言字符串解析,很急,求高手指点

时间:2022-01-13 18:52:38
我有一个如下结构体
struct s_DEMO{
char    branchcode[10+1];
int     boxno;
char    currencytype[2+1];
char    deonminationcode[2+1];
char    mainbitflag[1+1];
double  recvoccurquantum;
double  payeroccurquantum;
double  balance;
double  yesterdaybalance;
char    recordstate[1+1];
};
1、定义 s_DEMO s_demo,并对其赋值
2、将s_demo的地址传入到一个函数ExpStrByDef_Demo(&s_demo)
   函数的申明:ExpStrByDef_Demo(char *buf)
3、假设我已知道所传入的buf实际上是包含了如结构体所定义的每个元素的类型、长度.
   例如第一个域为char,长度11,第二个为int,第三个为char,长度为3,......,第6个double,......
   暂时所定的类型有int、long、char、double,除char外,其他类型无指定长度
4、请问,我如何在ExpStrByDef_Demo函数中根据已知的各字段类型来解析buf的内容,
   例如,我要获取buf的第1个域值、第2域的值、第3个域的值......
   我的机器是64位的,数据库也是64位的,使用的语言为C语言
   我自己大体知道个思路,就是按各类型所占的位数逐个的在buf中截取,但是对于int、long、double的处理
   本人就有些知识匮乏了,请高手指点,最好能贴出实例,不甚感激

18 个解决方案

#1


该回复于2010-06-11 09:08:38被版主删除

#2


可以试一下强制转换,编译器会根据数据类型计算偏移地址
ExpStrByDef_Demo(char *buf)
{
    struct s_DEMO *p = (struct s_DEMO*)buf;
    p->...
}

#3


我在函数中一定得把buf当作字符串处理,不能与任何的数据结构struct对应,因为那个函数是个接口性质的,不能动态的与某个struct对应上

#4


可以试一下强制转换,编译器会根据数据类型计算偏移地址
ExpStrByDef_Demo(char *buf)
{
    struct s_DEMO *p = (struct s_DEMO*)buf;
    p->...
}

#5



//方法一:
void ExpStrByDef_Demo(char *buf)
{
    s_DEMO *kk=(s_DEMO *)buf;

    printf("%s,%d\n",kk->branchcode,kk->boxno);  
}

void  ExpStrByDef_Demo(char *buf)
{
    char branchcode[11];
    int  boxno;
    
    memcpy(branchcode,buf,11);
    memcpy(&boxno,buf+11,sizeof(int));
}

//不知道有没有解释清楚
//QQ:7199963

#6


我试试5楼的

#7


如果不能和struct类型对应,我觉得可以通过sizeof(int)等来计算偏移量
在取int时
比如:
char *p = buf + 9;
int *pi = (int *)p;
具体的字节顺序与大小,编译器会自动做的。
不知道这样是否可以?

不过我觉得如果不与struct类型对应,那么传入的字符串,其前面的内容应该是固定已知的。
这点类似于struct sockaddr之间sockaddr_in的关系。

#8


这个用void*指针比较好

ExpStrByDef_Demo(void *buf)
{
    buf=(struct s_DEMO *)buf;
    buf->branchcode;//就是s_demo.branchcode,对buf->branchcode的操作作用在s_demo.branchcode上
    buf->boxno;//就是s_demo.boxno
    ....
}

用char*指针,代入时需要强制类型转换ExpStrByDef_Demo((char*)&s_demo)


ExpStrByDef_Demo(char *buf)
{
    buf=(struct s_DEMO *)buf;
    buf->branchcode;//就是s_demo.branchcode
    buf->boxno;//就是s_demo.boxno
    ....
}

#9


这个需要不同的机子得出不同的结构对齐方式以及int,double,float等的字节数。
然后获得每个字段的偏移量,就ok了。
我们的项目就这样实现了对结构赋值的可配置化。

#10


引用 5 楼 gz_qmc 的回复:
C/C++ code

//方法一:
void ExpStrByDef_Demo(char *buf)
{
    s_DEMO *kk=(s_DEMO *)buf;

    printf("%s,%d\n",kk->branchcode,kk->boxno);  
}

void  ExpStrByDef_Demo(char *buf)
{
    char branc……


可以的,然后根据需要,再转换相关字段成为Int,double 

#11


函数里面将buf强转成结构体不啥都解决了么 ,又不会动你的接口。

#12


ExpStrByDef_Demo(&s_demo)

这样传直接memcpy不就行了????


#13


其实喃..所有指针类型都是 unsigned long  你传的时候强制转换,要用的时候再强制转换回来..

或者把ExpStrByDef_Demo(char *buf)改为ExpStrByDef_Demo(void*buf)

#14


如果直接按char*处理,需要考虑结构体字节对齐。
还是在你那个函数中先强制转成s_DEMO *的指针类型,就可以访问各成员了,不用考虑对齐。

#15


9楼和7楼的能否说清楚点嘛,尤其是9楼,能否说说你们是怎么作的?qq 51770574

#16


我再解释下我需要的
1、在那个函数中是不知道buf是与那个结构体对应的
2、我想要得到的结果是,只知道buf可能是由一些char、int、long型的数值组合而成的一个地址连续的字符串,buf的首地址也即是这些组合的首地址
3、假设知道第一个变量的类型为char,第2个变量的类型为int,第3个变量为char,第4个变量类型为long,……
   对应要有如下的结果:
   char str1=第一个值
   int  i=第2个值
   char str2=第3个值
   long l=第4个值
   ……
不知道我这样讲,大家明白了没
5楼的我试了,不可以

#17


5 楼的可以啊,你只试用了方法一
试用了方法二吗?????????

#18


结构体不可以直接调用&s_demo吧?

#1


该回复于2010-06-11 09:08:38被版主删除

#2


可以试一下强制转换,编译器会根据数据类型计算偏移地址
ExpStrByDef_Demo(char *buf)
{
    struct s_DEMO *p = (struct s_DEMO*)buf;
    p->...
}

#3


我在函数中一定得把buf当作字符串处理,不能与任何的数据结构struct对应,因为那个函数是个接口性质的,不能动态的与某个struct对应上

#4


可以试一下强制转换,编译器会根据数据类型计算偏移地址
ExpStrByDef_Demo(char *buf)
{
    struct s_DEMO *p = (struct s_DEMO*)buf;
    p->...
}

#5



//方法一:
void ExpStrByDef_Demo(char *buf)
{
    s_DEMO *kk=(s_DEMO *)buf;

    printf("%s,%d\n",kk->branchcode,kk->boxno);  
}

void  ExpStrByDef_Demo(char *buf)
{
    char branchcode[11];
    int  boxno;
    
    memcpy(branchcode,buf,11);
    memcpy(&boxno,buf+11,sizeof(int));
}

//不知道有没有解释清楚
//QQ:7199963

#6


我试试5楼的

#7


如果不能和struct类型对应,我觉得可以通过sizeof(int)等来计算偏移量
在取int时
比如:
char *p = buf + 9;
int *pi = (int *)p;
具体的字节顺序与大小,编译器会自动做的。
不知道这样是否可以?

不过我觉得如果不与struct类型对应,那么传入的字符串,其前面的内容应该是固定已知的。
这点类似于struct sockaddr之间sockaddr_in的关系。

#8


这个用void*指针比较好

ExpStrByDef_Demo(void *buf)
{
    buf=(struct s_DEMO *)buf;
    buf->branchcode;//就是s_demo.branchcode,对buf->branchcode的操作作用在s_demo.branchcode上
    buf->boxno;//就是s_demo.boxno
    ....
}

用char*指针,代入时需要强制类型转换ExpStrByDef_Demo((char*)&s_demo)


ExpStrByDef_Demo(char *buf)
{
    buf=(struct s_DEMO *)buf;
    buf->branchcode;//就是s_demo.branchcode
    buf->boxno;//就是s_demo.boxno
    ....
}

#9


这个需要不同的机子得出不同的结构对齐方式以及int,double,float等的字节数。
然后获得每个字段的偏移量,就ok了。
我们的项目就这样实现了对结构赋值的可配置化。

#10


引用 5 楼 gz_qmc 的回复:
C/C++ code

//方法一:
void ExpStrByDef_Demo(char *buf)
{
    s_DEMO *kk=(s_DEMO *)buf;

    printf("%s,%d\n",kk->branchcode,kk->boxno);  
}

void  ExpStrByDef_Demo(char *buf)
{
    char branc……


可以的,然后根据需要,再转换相关字段成为Int,double 

#11


函数里面将buf强转成结构体不啥都解决了么 ,又不会动你的接口。

#12


ExpStrByDef_Demo(&s_demo)

这样传直接memcpy不就行了????


#13


其实喃..所有指针类型都是 unsigned long  你传的时候强制转换,要用的时候再强制转换回来..

或者把ExpStrByDef_Demo(char *buf)改为ExpStrByDef_Demo(void*buf)

#14


如果直接按char*处理,需要考虑结构体字节对齐。
还是在你那个函数中先强制转成s_DEMO *的指针类型,就可以访问各成员了,不用考虑对齐。

#15


9楼和7楼的能否说清楚点嘛,尤其是9楼,能否说说你们是怎么作的?qq 51770574

#16


我再解释下我需要的
1、在那个函数中是不知道buf是与那个结构体对应的
2、我想要得到的结果是,只知道buf可能是由一些char、int、long型的数值组合而成的一个地址连续的字符串,buf的首地址也即是这些组合的首地址
3、假设知道第一个变量的类型为char,第2个变量的类型为int,第3个变量为char,第4个变量类型为long,……
   对应要有如下的结果:
   char str1=第一个值
   int  i=第2个值
   char str2=第3个值
   long l=第4个值
   ……
不知道我这样讲,大家明白了没
5楼的我试了,不可以

#17


5 楼的可以啊,你只试用了方法一
试用了方法二吗?????????

#18


结构体不可以直接调用&s_demo吧?