社区
C语言
帖子详情
我想在结构中使用未知长度的字符串,可能实现吗?
jessenee
2003-10-09 03:23:29
struct aa
{
int len;//length of the struct
char str[20];//some charactors
}
我不想指定str的长度以便以后可以用sizeof得到len,有办法吗?
...全文
192
17
打赏
收藏
我想在结构中使用未知长度的字符串,可能实现吗?
struct aa { int len;//length of the struct char str[20];//some charactors } 我不想指定str的长度以便以后可以用sizeof得到len,有办法吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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可以在构造函数中分配内存。
Python 47个
字符串
方法
# Python 47个
字符串
方法## 课程介绍同学们是否总是要搜资料、查官网后,才知道怎么操作
字符串
?如果是,来学学本课程吧,本课程以讲解官网文档的方式,讲解 Python 47个
字符串
方法,涉及替换、删除、连接、查找、分割、格式化、编码、转换等
字符串
操作,带同学们系统学习 Python
字符串
方法。
为什么operator>>(istream&, string&)能够安全地读入
长度
未知
的
字符串
?
本文首先试验并分析了栈上定长字符数组输入字符的安全性(char buf[6]; scanf("%s", buf);),然后对operator>>(istream&, string&)的
实现
细节进行分析,最后仿照operator>>用C语言
实现
了读入
长度
未知
的
字符串
(字符行)
如何用C语言读取不定长
字符串
输入
请注意,
使用
动态内存分配需要谨慎考虑,必须在不再需要内存时释放它,以避免内存泄露。另外,在分配和重新分配内存时,还需要检查分配是否成功,以避免分配失败导致程序崩溃的情况。为了更好地处理这种情况,我们可以
使用
动态内存分配来分配足够的内存以存储任意
长度
的
字符串
,但这超出了本回答的范围。在读取过程
中
,我们还需要检查字符数是否超过了数组的
长度
,以防止内存溢出。要解决这个问题,我们可以
使用
动态内存分配来避免输入
字符串
长度
超过预设的字符数组大小。请注意,以上代码存在一个潜在的问题,即如果用户输入的
字符串
长度
超过了。
求
字符串
长度
的三种方法(C语言)
C语言求
字符串
长度
的三种写法
如何找到
字符串
中
的最长回文子串?
什么是回文串? 回文串其实就是正读和反读一样的
字符串
,那我们如何判断一个
字符串
是回文串?其实
实现
逻辑也比较简单,我们只需要
使用
双指针,一个从前往后遍历,一个从后往前遍历,关注遇到的字符是否相等即可。 代码如下: private static boolean isPalindromeString(String s) { if (s == null || s.length() == 0) { return true; } in.
C语言
69,373
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章