我想在结构中使用未知长度的字符串,可能实现吗?

jessenee 2003-10-09 03:23:29
struct aa
{
int len;//length of the struct
char str[20];//some charactors
}
我不想指定str的长度以便以后可以用sizeof得到len,有办法吗?
...全文
185 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
jessenee 2003-10-09
  • 打赏
  • 举报
回复
好的,我明白了,谢谢大家
sevencat 2003-10-09
  • 打赏
  • 举报
回复
肯定的,这样你可以临时动态生成一块缓冲区

class cbuffer
{
public:
char buf[256];
int m_used;
void use(int len)
{
m_used+=len;
}
bool put(aa &a)
{
if(m_used+len>256)
return false;
memcpy(...这里要加一个OFFSET,就是那个m_used);
use(a.len);return true;
}
}
然后可以每次生成一个aa后再放进去,不过这样效率不高,还不如直接对buf进行操作呢,省得再用memcpy来复制了。

class CBuffer
{
char buf[256];
int current;
aa* getaa(int len){current+=len;
aa* pa=(aa*)(buf+current);
pa->len=len;
return pa;}
然后再对aa->buf的内容进行操作。不过这样比较险。
}
TianGuangZao 2003-10-09
  • 打赏
  • 举报
回复
to jessenee:
如果你将指向结构的指针发送给对方是没有的,对方接收到的只是个指针,而实际他应该得到整个数据部分的一份拷贝。


jessenee 2003-10-09
  • 打赏
  • 举报
回复
sevencat(七猫)

想了一下还有点不是很明白,把可变的字符串放在最后应该是因为内存分配的问题吧。如果我的结构中含有多个结构,而不止一个需要有变长的字符串,不可能每个都在最后,我是不是可以计算出他们的总长度来分配内存呢?

还有赋值的时候要用memcpy吧?
jessenee 2003-10-09
  • 打赏
  • 举报
回复
TianGuangZao(天光早)

(char*)&struct 就是强制把struct的指针转换成char*,那样就能把struct内存中的东西直接发出去了。

关于 struct 的大小是不是等于所各个元素的大小之和一是看编译器,不过如果我的元素都是byte的整数倍,那得到的就应该是各个元素大小之和吧

sevencat(七猫)

你没理解错,应该就是我想要的,我试试,有问题在来提。
xdspower 2003-10-09
  • 打赏
  • 举报
回复
我觉得这个需要特殊处理,比如在发送时先发送长度,在发送实际字符串,这样就好处理了,在本地端也仅仅需要简单处理一个包含长度和字符串指针的结构
sevencat 2003-10-09
  • 打赏
  • 举报
回复
也许我理解错了,你是想要在这个类实例生成后再动态增加,减少大小?
直接发送的时候加上一句不就得了?
TianGuangZao 2003-10-09
  • 打赏
  • 举报
回复
我不太清楚你的意图是什么,你也没讲是用 C 还是 C++ 实现,在 C++ 里 struct 和 class 是同一个概念,名称不同而已,所以我看你用 struct,一般以为你会使用 C。

个人认为 CSDN 把版块合并很不合理,搞的非常混乱,应该严格分开来。

(char*)&struct 是一个字符指针类型的 cast。不过我不明白具体有什么用。

想得到 struct 的大小感觉是不合适的。本身 struct 的大小并不等于所各个元素的大小之和,而且可能不同的编译器,得到的结果不同。所以我认为传递 struct 的大小不是很有意义。


sevencat 2003-10-09
  • 打赏
  • 举报
回复
嘿,巧了,我也是在SOCKET完成端口中的IOBUFFER中用的这个东东。不过我代码里面比较复杂,假如你要的话,我稍微改一下给你。

不过有个最简单的办法来实现这一点。

class aa
{
public:
int len;
char buf[0];//这个一定要放在最后
private:
....
}

而且你这个类不能像下面这样出现在其他类中

class a
{
int a;
aa a;//这样不太行,你可以用指针aa *pa;在使用的时候再CreateAA(int len)的时候再生成。
int b;
}
aa* CServer::CreateAA(int len)
{
aa* paa;
paa=(aa*)new char(sizeof(int)+len)
paa->len=len+sizeof(int);
return paa;
}
反正你这只是一个简单类,不是吗?没有构你自己的构造函数,
不过这样的话不是很OOP的,
paa=(aa*)new char(sizeof(int)+len)这个可以直接放到operator new里面去的,然后直接调用也可以的。
quickball 2003-10-09
  • 打赏
  • 举报
回复
在结构中存储一个字符串指针char* sp;
或者使用标准库的string类最好。
jessenee 2003-10-09
  • 打赏
  • 举报
回复
单独发送内容也许可能行,不过那样做可能会很麻烦,而且网络利用率也很低,本来一个包能传送完的东西可能要分成7、8个来发,如果有别的办法我不想这么做
vsfan 2003-10-09
  • 打赏
  • 举报
回复
那可不可以单独发送内容呢?
jessenee 2003-10-09
  • 打赏
  • 举报
回复
TianGuangZao(天光早),你好!

我不是那个意思,我的len就是指结构的大小len=sizeof(struct)。不过没什么关系。

如果象你那样实现的话,我如果把(char*)&struct发出去,对方得到的是什么?是一个指针还是字符串内容?
jessenee 2003-10-09
  • 打赏
  • 举报
回复
sevencat(七猫),你好,能不能看看你的代码?

我这个结构必须是纯数据的,因为我要把它用socket发送出去。不过我可以把它放在一个class里面,发送的时候只发送结构应该就可以了。对方是根据len来接收的,实际情况很复杂。
TianGuangZao 2003-10-09
  • 打赏
  • 举报
回复
首先 sizeof 不是得到数组里所包含的字符个数,而是整个数组的大小,即使数组为空,数组的大小不变。
要想得到字符个数,或讲字符串的长度,请使用 strlen() 函数。

如果你不想在结构里固定字符串的长度,建议改成指针,然后在需要时动态分配空间。
如:


#include <stdio.h>
#include <string.h>

typedef struct
{
int size; // not length of struct,it is space size of string array
int len; // it is length of string
char *pstr; // a pointer point to a string
} AA;

int main()
{
AA aa;

aa.size = 20;
aa.pstr = (char *)malloc(20 * sizeof*aa.pstr);
strcpy(aa.pstr, "Hello, world!");
aa.len = strlen(aa.pstr);

printf("The length of string \"%s\" is %d\n", aa.pstr, aa.len);

free(aa.pstr);
return 0;
}
sevencat 2003-10-09
  • 打赏
  • 举报
回复
可以的,
不过需要写operator new
在构造函数里面分配已经晚了。
我写了一个可变缓冲区类。
再用ALLOCATOR类实现的池管理,感觉还可以。
ttlb 2003-10-09
  • 打赏
  • 举报
回复
可以呀,struct和class没什么不同。str可以在构造函数中分配内存。

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧