C 实现C++中String类的字符串
RT我想用C实现类似C++中String类的那种可以存储任意长度的字符串不知能不能实现
希望不会被鄙视
盼望得到解答谢谢 本帖最后由 bester 于 2011-3-21 16:00 编辑
有这样的想法很好啊,我学C++的时候也自己写过string。
C可以实现string中存储任意长度的字符串这个功能的。不过需要你自己定义数据结构。毕竟C没有像STL之类的东西。
我说下实现的原理,你自己试试能不能实现:
我们用的char数组,其实就是一个连续的内存空间。每个元素占一个字节的大小。
我们用C定义的数组之所以需要先确定其大小,其实就是为了先申请好相应大小的连续空间。这样我们至少有两种思路来实现LZ所说功能,我分别说下,并说明各自的优缺点:
思路一、当数组大小发生变化时,重新申请内存并将字符串复制到新内存中。
比如当前字符串的长度为5,现在需要新增加7字节的字符,现在的内存空间存放不了5+7个字节。这时我们就新new一块内存空间,然后将老/新字符串都宝贝过去,然后把新的内容空间地址指给这个数组,然后将当前的内存释放掉就可以了。(有点儿啰嗦不知道LZ明白米?{:1_907:})
评论下这个方式的优缺点:
优点: 我们要访问数组中的元素时,可以直接用 数组名[下标] 的方式直接饮用。方便,快捷。
缺点: 当数组大小发生变化时,需要重新申请内存、内存拷贝、释放内存。如果变化频繁,则频繁内存操作导致程序效率地下。如果字符串相当长,则内存使用率不高。
改进方式: 1、先申请一段(比如255字节),当255不够的时候,再申请255*2的内存;不要每次大小变化都申请内存减少内存申请释放和内存拷贝频率。
2、可以一下申请一个比较大的内存,自己来做管理。不要每次都malloc和free。
思路二、使用指针将每个字符串中的字符联起来。
知道了思路一的缺点,我们就可以对应的改进一下。定义一个结构,其中有两个指针分别指向字符串中的前一个字符和后一个字符,这样每次添加字符时我们只要申请新的内存来存放新加入的字符就可以了。省去了内存中将数据来回拷贝的麻烦。
也不需要内存必须是连续的了。
评论下这个方式的优缺点:
1、优点:
a、存放字符串的内存不需要连续的,更不需要频繁的内存拷贝操作可以有效的使用内存。
b、比较适合存放大型数据(本例存放字符串不是很合适:不考虑内存对齐的情况下,存放一个字节就需要用9个字节的空间(两个指针占8字节,一个数据占一个字节)考虑内存对齐就更多了)。
2、缺点:
a、频繁的指针操作,容易引发内存泄露、野指针之类的Bug,导致程序不稳定。
b、定位字符串中某个元素不方面(每次定位都需要从头遍历),效率不高。
改进方法: LZ可以考虑下 将思路一和思路二结合一下……
当然,出于学习的考虑,LZ可以考虑实现下:
1、对字符串排序。
2、对字符串的比较。
3、对字符串的查询(比如字符串A中是否包含字符串B)。 回复 bester 的帖子
话说首先谢谢bester的解惑 思路一我考虑过了因为觉得麻烦 所以想用指针来着
按照大大的思想可不可以定义一个结构体其中一个数组str[]一个整型变量size 接收到一个字符串的时候 用size记录长度然后用str[]申请这个大小的内存空间 (不知道逻辑清楚没、、、汗一个先、、、) 回复 梦已喂马 的帖子
完全米问题,嘿嘿
只是要记住申请的时候,需要将现在使用的内存释放。
还有结构的其中一个不能是数组,要用指针。数组是需要先确定其空间大小的。这样你定义的size就没意义了~也不灵活。 额我刚想到这样跟第一个思路是没什么区别的
丢脸了谢谢提醒、、、、、 楼主是为了实现某种通用的?
其实,某些环境下,这些都不是问题的,例如许多后续版本都可以重定义数组大小了。VC直接带CString,CStringArray.
STL也有,另外,boost中有着方面的好的例子 我想LZ是想学习吧。毕竟他想用C模仿C++的string说明他知道有STL的,也或许是开发环境限制,只能用C来写……
不过,如果LZ是在只限制C的环境下,我想应该不会问这种问题,所以学习的可能性大些这样的话,自己写写有好处的。
不要全依赖现成的东西…… 回复 梦已喂马 的帖子
呵呵其实C和C++都学过然后就是想看一下那个C++的Cstring类是怎么弄的其实估计也是封装了的吧 申请内存的手段高明点 然后就想看能不能自己做一个出来
要是通用的话 貌似直接include就好了呵呵 额 话说 新手就是新手啊本来是回复7楼的点成回复自己了悲剧鸟、、、
谢谢bester 夸奖 哈哈我是个好学生!
页:
[1]
2