hrefspace

 找回密码
 立即注册
搜索
热搜: PHP PS 程序设计
查看: 1074|回复: 7

C/C++中如何遍历结构体的元素?

[复制链接]

460

主题

460

帖子

1402

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1402
发表于 2024-3-11 00:34:06 | 显示全部楼层 |阅读模式
我现在有一个需求:
已知某人给我提供了 一个动态库,和对应的头文件。头文件里面描述了结构体的各种元素,大概有50多个,元素全是char数组,大小不一。

我现在需要遍历这些元素,把它们join成一个字符串,可有什么便捷的好方法,我该不会一个一个的用操作符 ->取出来吧?  

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

0

主题

180

帖子

76

积分

关内侯

Rank: 2

积分
76
发表于 2024-3-11 00:34:57 | 显示全部楼层
不知道你说的是什么样的结构体,如果不是指针类型而是已明确了成员的char var[N]; 这种情况下,结构体大小是确定的sizeof ,数据是一片连续内存块,那么就不需要知道各个成员是什么名字。
接下来就是去掉这内存块里面的零值。
最后printf.
回复

使用道具 举报

0

主题

178

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2024-3-11 00:35:24 | 显示全部楼层
2# G-Spider
有50多个成员,每一个成员都是char var[N], 但每一个成员的N是不一样的,没有规律。
去掉内存块的零值是啥意思,求解释。
回复

使用道具 举报

0

主题

189

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2024-3-11 00:36:00 | 显示全部楼层
3# wayne
偷懒的局限性在代码的注释中
  1. #include <stdio.h>#include <string.h>typedef struct{    char d0[12];    char d1[6];    char d2[5];}tD,*pD;void removezero(char *dst,char *src,int len){    char *p=src;    int i;    for(i=0;i<len;i+=strlen(p)+1)    {        p=src+i;        strcat(dst,p);        }}void main(){    pD src=NULL,dst=NULL;    src=(pD)malloc(sizeof(tD));    dst=(pD)malloc(sizeof(tD));    if(NULL==src|| NULL==dst)        return;    memset(dst,0,sizeof(tD));    memset(src,0,sizeof(tD)); /*块需初始化为0*/        strcpy(src->d0,"good");    strcpy(src->d1,"luck");    strcpy(src->d2,"man");    /*-------------------join---------------------*/    removezero((char *)dst,(char *)src,sizeof(tD));        printf("%s\n",dst);    system("pause");}
复制代码
回复

使用道具 举报

0

主题

183

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2024-3-11 00:36:33 | 显示全部楼层
4# G-Spider
不错,有点tricky,我知道怎么做了。
我的实际需求其实是把结构体的都是char []的成员用逗号 join 成一个字符串。

===========
BTW,貌似高手都不太喜欢用calloc呢,
  1. #include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct {    char d0[12];    char d1[6];    char d2[5];} tD,*pD;void removezero(char *dst,char *src,int len){    char *p=src;    int i;    for(i=0; i<len; i+=strlen(p)+1) {        p=src+i;        strcat(dst,p);    }}int main(){    pD src=NULL,dst=NULL;    src=(pD)calloc(1,sizeof(tD));    dst=(pD)calloc(1,sizeof(tD));    if(NULL==src|| NULL==dst)        return 1;   // memset(dst,0,sizeof(tD));   // memset(src,0,sizeof(tD)); /*彘濮邃负0*/    strcpy(src->d0,"good");    strcpy(src->d1,"luck");    strcpy(src->d2,"man");    /*-------------------join---------------------*/    removezero((char *)dst,(char *)src,sizeof(tD));    printf("%s\n",(char *)dst);//    system("pause");    return 0;}
复制代码
回复

使用道具 举报

0

主题

191

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2024-3-11 00:37:09 | 显示全部楼层
修改下removezero逗号分隔

for(...)
{
    p=src+i;
    if(*p)
    {
        strcat(dst,p);
        dst[strlen(dst)]=',';
    }
}
dst[strlen(dst)-1]=0;
回复

使用道具 举报

0

主题

172

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2024-3-11 00:37:21 | 显示全部楼层
4# G-Spider
不错,有点tricky,我知道怎么做了。
我的实际需求其实是把结构体的都是char []的成员用逗号 join 成一个字符串。

===========
BTW,貌似高手都不太喜欢用calloc呢,#include
#include
#inc ...
wayne 发表于 2013-5-14 11:05

以前只知道 malloc/realloc/free,还真没注意到calloc;
刚刚查了下MSDN,alloc 与realloc一样有一个额外动作:分配内存中的一个数组的元素初始化为 0

alloc 似乎还有一个特殊功能:可得到确保为存储指定对象的内存对齐。
但是,数据对齐现在有了更好的函数:_aligned_malloc / _aligned_offset_malloc / _aligned_free
再加上 memset 函数,即可达到相同目的,且更自由。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

0

主题

161

帖子

33

积分

新手上路

Rank: 1

积分
33
发表于 2024-3-11 00:37:36 | 显示全部楼层
5#,哈,主要是用习惯了吧,  malloc的好处是,是否需要初始化memset倒可以放到需要的地方。

郭说的这个分配一个数据对齐的内存,只前尝试大数库的时候倒有体会,也思考了很久,特别是为了有个16字节对齐的内存好SSE的相关处理。

7# 提到的_aligned_malloc /_aligned_free 第一次听到,由于不是标准库里的函数,于是百度了一下想知道其原理,发现与我之前想的一致:
就是多申请一些空间用于保存申请的内存的原地址,以便用于释放。
而保存原地址的位置在对齐边界后p的前一个sizeof(void *)的地方即&p[-1],里面的值p[-1]为原malloc返回的地址,p是对齐后的地址。
  1. #include <stdio.h>void* _mm_malloc (size_t size, size_t align){    void * malloc_ptr;    void * aligned_ptr;    /* Error if align is not a power of two.  */    if (align & (align - 1))    {      return ((void*) 0);    }    if (size == 0)        return ((void *) 0);    /* Assume malloc'd pointer is aligned at least to sizeof (void*).       If necessary, add another sizeof (void*) to store the value       returned by malloc. Effectively this enforces a minimum alignment       of sizeof double. */         if (align < 2 * sizeof (void *))        align = 2 * sizeof (void *);    malloc_ptr =(void *)malloc(size + align);    if (!malloc_ptr)        return ((void *) 0);    /* Align  We have at least sizeof (void *) space below malloc'd ptr. */    aligned_ptr = (void *) (((size_t) malloc_ptr + align)                          & ~((size_t) (align) - 1));    /* Store the original pointer just before p.  */          ((void **) aligned_ptr) [-1] = malloc_ptr;    return aligned_ptr;}void _mm_free (void * aligned_ptr){    if (aligned_ptr)        free (((void **) aligned_ptr) [-1]);}void main(){    char *data;    /* 没用过[-1]的数组定位方式,测试一下*/    char d[4]={'a','b','c','d'};    char *p=&d[2];    printf("%c\n",p[-1]);    /**************************************/    data=(char *)_mm_malloc(12,64);    printf("%p %08X\n",data,((unsigned int *)data)[-1]);    _mm_free(data);    }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|hrefspace

GMT+8, 2024-5-8 17:43 , Processed in 0.074014 second(s), 22 queries .

Powered by hrefspace X3.4 Licensed

Copyright © 2022, hrefspace.

快速回复 返回顶部 返回列表