免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: dynamic516
打印 上一主题 下一主题

[C] 请教字符串直接分段放入结构体的方法 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
11 [报告]
发表于 2008-03-06 14:02 |只看该作者
接口都给你设计好了:
  1. void *adjustPacket( const char *template, const char *input );
复制代码

调用:
  1. struct DataStruct packet;
  2. str = "16headerdatatail";
  3. memcpy( &packet, adjustPacket( "2 6 4 4", str ), sizeof(packet) );
复制代码

或者:
  1. struct DataStruct *packet;
  2. str = "16headerdatatail";
  3. packet = (struct DataStruct *)adjustPacket( "2 6 4 4", str );
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
12 [报告]
发表于 2008-03-06 14:04 |只看该作者
原帖由 dynamic516 于 2008-3-6 14:02 发表

只要找到规律就好!实在经典,很喜欢perl的正则,虽然掌握的不好,呵呵
串里填0是个好方法。

我就是想看这样的定义可不可以“直接 memcpy 整个结构体或者强制类型转换。“

看来是这样的数据结构不怎么 ...

我们以前传 struct 都是直接传整个 struct,不会像你们这样把 \0 去掉。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
13 [报告]
发表于 2008-03-06 14:06 |只看该作者

回复 #11 flw 的帖子

记得管理好内存。
看是用 malloc(适合第二种用法) 呢,还是 static char[](适合第一种用法) 呢。
如果是前者的话,要记得 free,
如果是后者的话,要记得在第二次调用之前及时 memcpy 出来。
另外也不能是多线程的。

论坛徽章:
0
14 [报告]
发表于 2008-03-06 14:10 |只看该作者
斑竹果然好热心肠,Thanks!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
15 [报告]
发表于 2008-03-06 14:13 |只看该作者
"2 6 4 4" 也可以写作 "3 7 5 5",
然后通过宏定义的技巧,用每个成员的 size 自动生成。比如这样:
  1. struct foo{
  2.     char len[ FLW_LEN_SIZE + 1 ];
  3.     char header[ FLW_HEADER_SIZE + 1 ];
  4.     char data[ FLW_DATA_SIZE + 1 ];
  5.     char tail[ FLW_TAIL_SIZE + 1 ];
  6. };

  7. # defined FLW_TEMPLATE ##FLW_LEN_SIZE " " ##FLW_HEADER_SIZE " "...............
复制代码

好处有二:
1,数据包的结构(template)的定义和 C struct 的定义放在一起,可读性好。
2,避免硬编码一个常量两次。这样以后修改的时候不容易出问题。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
16 [报告]
发表于 2008-03-06 14:15 |只看该作者
原帖由 dynamic516 于 2008-3-6 14:10 发表
斑竹果然好热心肠,Thanks!

这些语法糖都是小术,
其实没必要花费太多的心思在上面,
我只不过是站在如何去偷懒的角度去看待这个问题,
其实大多数人大多数情况下完全没必要在这些细节上花费太多的精力。

论坛徽章:
0
17 [报告]
发表于 2008-03-06 15:43 |只看该作者
设计合理,union也是个不错的方法。

论坛徽章:
0
18 [报告]
发表于 2008-03-06 21:04 |只看该作者
用sscanf挺方便的吧?

论坛徽章:
0
19 [报告]
发表于 2015-09-29 22:33 |只看该作者
MyDataStruct  temp = (MyDataStruct  )(*str);
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP