免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9342 | 回复: 18
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-06 13:40 |只看该作者 |倒序浏览
如果有这么一个串:
char *str="16headerdatatail";
怎么可以比较方便把
16
header
data
tail
这四部分分别当字串存入一个结构体呢?
我是这样
memcpy(MyDataStruct.length,str,2);
来得到
MyDataStruct.length=“16”的;
写法太麻烦了,CU的高手支个招吧,呵呵。

论坛徽章:
0
2 [报告]
发表于 2008-03-06 13:42 |只看该作者
你觉得会有万能的方法吗? 这个需要你根据自己的数据结构,来用代码实现。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2008-03-06 13:43 |只看该作者
unpack 吧。
  1. my ($len, $header, $data, $tail) = unpack( 'a2 a6 a4 a4', $str );
复制代码

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2008-03-06 13:43 |只看该作者
str1 = "16";
str2 = "header";
str3 = "data";
str4 = "tail";

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2008-03-06 13:47 |只看该作者
原帖由 lenovo 于 2008-3-6 13:43 发表
str1 = "16";
str2 = "header";
str3 = "data";
str4 = "tail";

字符串切割……

论坛徽章:
0
6 [报告]
发表于 2008-03-06 13:48 |只看该作者
原帖由 flw 于 2008-3-6 13:43 发表
unpack 吧。
my ($len, $header, $data, $tail) = unpack( 'a2 a6 a4 a4', $str );

脚本语言就是帅,就是帅。

论坛徽章:
0
7 [报告]
发表于 2008-03-06 13:50 |只看该作者
我的意思就是
memcpy(MyDataStruct.length,str,2);

str1 = "16";
str2 = "header";
str3 = "data";
str4 = "tail";
逐个赋值好麻烦,可否有简单的写法?

flw是三句话不离四个字  perl 呵呵呵
C有什么好方法把这个str分段放进结构体呢

比如结构体这样定义
typedef struct DataStruct
{
char length[3];
char header[7];
char data[5];
char tail[5];
}MyDataStruct;

只能逐个赋值吗?
}

论坛徽章:
0
8 [报告]
发表于 2008-03-06 13:52 |只看该作者
我想一次把它放入结构体,免得写那么多语句,呵呵,有点懒!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2008-03-06 13:57 |只看该作者
楼上的,你用 C 写一个 unpack 也不难啊。
还有啊,其实你的协议如果设计的好的话,
直接 memcpy 整个结构体或者强制类型转换就可以了。
只要找到规律就好。
比如你举的这个例子,规律就是数据包里的每个字段长度正好是 C 结构的成员的数组长度减一,
那么你就可以写个函数,传递一个 "2 6 4 4" 的字符串作为参数,
然后在函数内部申请一段儿空间,for 循环调整一下每个字段的长度,然后返回调整后的 buffer:
  1. "16\0header\0data\0tail\0"
复制代码

写个这样的函数不难吧?
然后把这个返回的 buffer memcpy 到 struct 里就好了。

论坛徽章:
0
10 [报告]
发表于 2008-03-06 14:02 |只看该作者
原帖由 flw 于 2008-3-6 13:57 发表
楼上的,你用 C 写一个 unpack 也不难啊。
还有啊,其实你的协议如果设计的好的话,
直接 memcpy 整个结构体或者强制类型转换就可以了。
只要找到规律就好。
比如你举的这个例子,规律就是数据包里的每个字 ...

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

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

看来是这样的数据结构不怎么好,呵呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP