应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

C语言实现动态扩容的string

  众所周知,C中的string使用比较方便。关于C中的string源码实现
  最近工作中使用C语言,但又苦于没有高效的字符串实现,字符串的拼接和裁剪都比较麻烦,而且每个字符串都需要申请内存,内存的申请和释放也很容易出bug,怎么高效的实现一个不需要处理内存问题并且可以动态扩容进行拼接和裁剪的string呢?
  一个好的string应该有以下功能?创建字符串删除字符串尾部追加字符串头部插入字符串从尾部删除N个字符从头部删除N个字符裁剪字符串获取字符串长度获取完整字符串
  下面,我们来看看各个功能的实现。
  首先定义一个string的句柄,相当于C中的实例。structcstring;typedefstructcstringcstringt;
  在内部string的实现如下:string的初始内存大小staticconstsizetcstringminsize32;
  structcstring{charstr;字符串指针sizetalloced;已分配的内存大小sizetlen;字符串的实际长度};
  创建字符串:cstringtcstringcreate(void){cstringtcs;
  cscalloc(1,sizeof(cs));csstrmalloc(cstringminsize);csstr;初始分配内存大小是32,之后每次以2倍大小扩容csallocedcstringminsize;cslen0;
  returncs;}
  销毁字符串:voidcstringdestroy(cstringtcs){if(csNULL)return;free(csstr);free(cs);}
  内部如何扩容呢:staticvoidcstringensurespace(cstringtcs,sizetaddlen){if(csNULLaddlen0)return;
  if(csallocedcslenaddlen1)return;
  while(csallocedcslenaddlen1){csalloced1;每次以2倍大小扩容if(csalloced0){左移到最后可能会变为0,由于alloced是无符号型,减一则会变成UINTMAXcsalloced;}}csstrrealloc(csstr,csalloced);}
  在尾部追加字符串:voidcstringappendstr(cstringtcs,constcharstr,sizetlen){if(csNULLstrNULLstr)return;
  if(len0)lenstrlen(str);
  cstringensurespace(cs,len);确保内部有足够的空间存储字符串memmove(csstrcslen,str,len);cslenlen;csstr〔cslen〕;}
  在尾部追加字符:voidcstringappendchar(cstringtcs,charc){if(csNULL)return;cstringensurespace(cs,1);csstr〔cslen〕c;cslen;csstr〔cslen〕;}
  在尾部追加整数:voidcstringappendint(cstringtcs,intval){charstr〔12〕;
  if(csNULL)return;
  snprintf(str,sizeof(str),d,val);整数转为字符串cstringappendstr(cs,str,0);}
  在头部插入字符串:voidcstringfrontstr(cstringtcs,constcharstr,sizetlen){if(csNULLstrNULLstr)return;
  if(len0)lenstrlen(str);
  cstringensurespace(cs,len);memmove(csstrlen,csstr,cslen);memmove(csstr,str,len);cslenlen;csstr〔cslen〕;}
  在头部插入字符:voidcstringfrontchar(cstringtcs,charc){if(csNULL)return;cstringensurespace(cs,1);memmove(csstr1,csstr,cslen);csstr〔0〕c;cslen;csstr〔cslen〕;}
  在头部插入整数:voidcstringfrontint(cstringtcs,intval){charstr〔12〕;
  if(csNULL)return;
  snprintf(str,sizeof(str),d,val);cstringfrontstr(cs,str,0);}
  清空字符串:voidcstringclear(cstringtcs){if(csNULL)return;cstringtruncate(cs,0);}
  裁剪字符串:voidcstringtruncate(cstringtcs,sizetlen){if(csNULLlencslen)return;
  cslenlen;csstr〔cslen〕;}
  删除头部的N个字符:voidcstringdropbegin(cstringtcs,sizetlen){if(csNULLlen0)return;
  if(lencslen){cstringclear(cs);return;}
  cslenlen;memmove(csstr,csstrlen,cslen1);}
  删除尾部的N个字符:voidcstringdropend(cstringtcs,sizetlen){if(csNULLlen0)return;
  if(lencslen){cstringclear(cs);return;}cslenlen;csstr〔cslen〕;}
  获取字符串的长度:sizetcstringlen(constcstringtcs){if(csNULL)return0;returncslen;}
  返回字符串指针,使用的是内部的内存:constcharcstringpeek(constcstringtcs){if(csNULL)returnNULL;returncsstr;}
  重新分配一块内存存储字符串返回:charcstringdump(constcstringtcs,sizetlen){charout;
  if(csNULL)returnNULL;
  if(len!NULL)lencslen;outmalloc(cslen1);memcpy(out,csstr,cslen1);returnout;}
  测试代码如下:intmain(){cstringtcscstringcreate();cstringappendstr(cs,123,0);cstringappendchar(cs,4);cstringappendint(cs,5);printf(s,cstringpeek(cs));cstringfrontstr(cs,789,0);printf(s,cstringpeek(cs));cstringdropbegin(cs,2);printf(s,cstringpeek(cs));cstringdropend(cs,2);printf(s,cstringpeek(cs));cstringdestroy(cs);return0;}
  输出:
  12345hr78912345hr912345hr9123hr完整代码如下:头文件:includestddef。h
  structcstring;typedefstructcstringcstringt;
  cstringtcstringcreate(void);
  voidcstringdestroy(cstringtcs);
  voidcstringappendstr(cstringtcs,constcharstr,sizetlen);
  voidcstringappendchar(cstringtcs,charc);
  voidcstringappendint(cstringtcs,intval);
  voidcstringfrontstr(cstringtcs,constcharstr,sizetlen);
  voidcstringfrontchar(cstringtcs,charc);
  voidcstringfrontint(cstringtcs,intval);
  voidcstringclear(cstringtcs);
  voidcstringtruncate(cstringtcs,sizetlen);
  voidcstringdropbegin(cstringtcs,sizetlen);
  voidcstringdropend(cstringtcs,sizetlen);
  sizetcstringlen(constcstringtcs);
  constcharcstringpeek(constcstringtcs);
  charcstringdump(constcstringtcs,sizetlen);
  源文件:includectype。hincludestdbool。hincludestdlib。hincludestdio。hincludestring。h
  staticconstsizetcstringminsize32;
  structcstring{charstr;sizetalloced;sizetlen;};
  cstringtcstringcreate(void){cstringtcs;
  cscalloc(1,sizeof(cs));csstrmalloc(cstringminsize);csstr;csallocedcstringminsize;cslen0;
  returncs;}
  voidcstringdestroy(cstringtcs){if(csNULL)return;free(csstr);free(cs);}
  staticvoidcstringensurespace(cstringtcs,sizetaddlen){if(csNULLaddlen0)return;
  if(csallocedcslenaddlen1)return;
  while(csallocedcslenaddlen1){csalloced1;if(csalloced0){csalloced;}}csstrrealloc(csstr,csalloced);}
  voidcstringappendstr(cstringtcs,constcharstr,sizetlen){if(csNULLstrNULLstr)return;
  if(len0)lenstrlen(str);
  cstringensurespace(cs,len);memmove(csstrcslen,str,len);cslenlen;csstr〔cslen〕;}
  voidcstringappendchar(cstringtcs,charc){if(csNULL)return;cstringensurespace(cs,1);csstr〔cslen〕c;cslen;csstr〔cslen〕;}
  voidcstringappendint(cstringtcs,intval){charstr〔12〕;
  if(csNULL)return;
  snprintf(str,sizeof(str),d,val);cstringappendstr(cs,str,0);}
  voidcstringfrontstr(cstringtcs,constcharstr,sizetlen){if(csNULLstrNULLstr)return;
  if(len0)lenstrlen(str);
  cstringensurespace(cs,len);memmove(csstrlen,csstr,cslen);memmove(csstr,str,len);cslenlen;csstr〔cslen〕;}
  voidcstringfrontchar(cstringtcs,charc){if(csNULL)return;cstringensurespace(cs,1);memmove(csstr1,csstr,cslen);csstr〔0〕c;cslen;csstr〔cslen〕;}
  voidcstringfrontint(cstringtcs,intval){charstr〔12〕;
  if(csNULL)return;
  snprintf(str,sizeof(str),d,val);cstringfrontstr(cs,str,0);}
  voidcstringclear(cstringtcs){if(csNULL)return;cstringtruncate(cs,0);}
  voidcstringtruncate(cstringtcs,sizetlen){if(csNULLlencslen)return;
  cslenlen;csstr〔cslen〕;}
  voidcstringdropbegin(cstringtcs,sizetlen){if(csNULLlen0)return;
  if(lencslen){cstringclear(cs);return;}
  cslenlen;1tomovetheNULL。memmove(csstr,csstrlen,cslen1);}
  voidcstringdropend(cstringtcs,sizetlen){if(csNULLlen0)return;
  if(lencslen){cstringclear(cs);return;}cslenlen;csstr〔cslen〕;}
  sizetcstringlen(constcstringtcs){if(csNULL)return0;returncslen;}
  constcharcstringpeek(constcstringtcs){if(csNULL)returnNULL;returncsstr;}
  charcstringdump(constcstringtcs,sizetlen){charout;
  if(csNULL)returnNULL;
  if(len!NULL)lencslen;outmalloc(cslen1);memcpy(out,csstr,cslen1);returnout;}

六胜塔海上丝绸之路的第一座灯塔2021年7月25日,第44届世界遗产大会审议通过:泉州:宋元中国的世界海洋商贸中心正式成为中国第56处世界遗产。它反映了特定历史时期独特而杰出的港口城市空间结构,其所包含的2……荧幕硬汉任程伟一无所有时黄蕾陪伴左右,成名后绝不抛弃妻子娱乐圈中有不少明星夫妻,他们有的是在校园中认识,相伴相守到今日。有的是在工作后,才结识,双方志趣相同,共同在娱乐圈中打拼。很多人都觉得,校园恋爱,是一生中最纯洁的一段感情。……今年,无美白静悄悄长久以来,在我国,美白是仅次于保湿的第二大需求市场。不过,青眼发现,由于新规落地,今年的祛斑美白新品减少,国产和进口祛斑美白类新品加起来不到70个。多家品牌方和工厂……X社一体变形通天晓公布!2022年第二季度发售最近NA家小比例的通天晓正式发售,我也刚拿到产品,最近就会做视频。而前几天X社也公布了MP比例的通天晓,我们一起简单看一下!图片转自微博用户TRANSBOTS……春暖花开,与爱相拥在花的眼睛里,这个世界永远都是春天,这便是凋谢的意义。原创文案,网图侵删。记住别人的好,可以培养自己谦虚的品质。人无完人,对人宽容就是对己宽容;善待别人,其实就是善待自己……4。27NBA季后赛速报NBA季后赛今天刚刚结束了两场比赛:热火VS老鹰热火巴特勒缺战,主场以9794战胜老鹰,41淘汰老鹰,晋级东部半决赛,他们的对手是76人与猛龙的胜者。老鹰队:亨特3……这4种常见的抽烟方式,或会更加损伤人体的健康,希望尽早改掉据调查研究发现,到目前为止,我国的吸烟者总数仍旧呈现着逐年递增的趋势。虽然几乎所有人都知道吸烟有害健康,烟草中的尼古丁、焦油等物质在进入人体后,会对人体的肺脏、肝脏、血管……两连胜!广东19岁小将砍1463成惊喜,杜锋赛后一席话令人捧CBA常规赛第二轮,广东宏远与青岛的比赛已经落下帷幕,最终广东凭借球队在第三节的三分雨成功破掉对手联防,建立起两位数的领先优势,最终以10390战胜对手,拿下两连胜。本场比赛球……金铲铲之战版本答案来了,把把硬玩直冲王者!璐璐,快快变大大家好,我是小嗨。本期为大家带来的是新赛季上分阵容超级璐璐阵容看点:冷门D卡流阵容,无同行全3星稳定前3本阵容适用于铲子阵容组成:璐璐、普朗克、悠米、墨……体坛女将谷爱凌与何诗蓓的为国争光,就是动人的爱国篇章北京冬奥会开幕正进入倒计时,中美混血的中国选手谷爱凌(EileenGu)近日在国际雪联自由式滑雪世界杯美国猛犸山站,凭借世界杯U型场地项目四站全胜的成绩,谷爱凌获得本赛季该项目……热血传奇战士三大必学技能,烈火刀法伤害爆炸,开天斩作用最大在传奇里战士一直都是深受玩家喜爱的职业,因为不管是外观还是装备性价比都不是另外两个职业能比的。但是战士是装备开销最大的职业,其实不论装备和技能,战士还是非常吃操作的。战士有着三……鼓励各地发行旅游消费券!广东8条帮扶措施为旅行社行业纾困近日,广东省文化和旅游厅与省直机关工委、教育厅、财政厅、人力资源和社会保障厅、市场监管局、地方金融监管局、人行广州分行、广东省税务局、广东银保监局、省总工会等11个部门联合印发……
散文我是不是很伟大文王小鱼一hr喝过酒之后,我想到海子,想到许立志。我还想到一些英雄人物,邱少云,黄继光。我不止一次地想过他们,想过我活在这个世上,应该学习雷锋。记得我学会的第一首歌曲,我……今天大寒,老话说大寒吃一鲜,一年病不沾,1鲜指什么?今天是二十四节气当中的最后一个节气大寒。大寒节气处在三九、四九时段,所以也是一年当中最寒冷的时候。而且今年大寒节气和春节除夕相近,1月20日是大寒,1月21日是除夕,1月22日……旅行社大批出境游产品节后上新1月22日,菲律宾马尼拉中国城举行舞龙舞狮表演等活动,庆祝农历新年的到来供图新华社日前,文旅部宣布,自2月6日起,试点恢复全国旅行社及在线旅游企业经营中国公民赴有关国家出……1胜21负!勇士甩锅22岁水货榜眼,联盟倒数第1出炉,库里躲北京时间4月6日,活塞108比123输给篮网,遭遇11连败。活塞16胜64负已经提前锁定联盟倒数第一的战绩。值得一提的是,活塞引进怀斯曼之后,战绩变得更加糟糕。怀斯曼为活塞打了……天下泰山丨山村春意质朴绚丽来源:【中华泰山网】泰安日报社中华泰山网讯草长莺飞的时节,泰山樱桃园的樱桃花竞相绽放,密密匝匝开满枝头,随风摇曳生姿。游人漫步树下,赏繁花,话春意,构成了一幅春日特有的绚……高盛预测年内铜价或创新高!紫金矿业股价或将重估?根据高盛最近预测显示,由于中国在世界上大量的收购铜,使得全世界现货铜库存量降到历史最低水平,如果收购将继续维持下去现货铜的供应将供不应求!铜价在近几个月内或将达到12000美元……江西婺源广袤田野金色油菜花盛开美丽春景引客来图为婺源县溪头乡江岭景区,不少摄影爱好者在高处平台上拍摄远处的连片金色油菜花田和乡村美景。胡敦煌摄图为婺源县溪头乡江岭景区的金色油菜花盛开,与白墙黛瓦的村落相映成趣,构成……硅谷扩大裁员!亚马逊将再减员9000人,25万华人精英或被动【阅读此文之前,麻烦您点击下关注,方便与您讨论分享,也能及时观看下一篇精彩文章。非常感谢您的关注!】近年来,许多公司遭遇了大量裁员风波。其中最主要原因是互联网行业的竞争日……拼团系统开发模式玩法流程介绍拼团系统开发拼团系统是近几年兴起的一种商业模式,它不仅可以让消费者享受到低价商品,还能帮商家完成促销,从而在短时间内积累庞大的客户流量。下面就详细分析一下,拼团系统模式的玩法流……中国国际时装周舞台上演新自由主义时装作品中国国际时装周舞台上演新自由主义时装作品中国青年报客户端3月26日,多名模特在位于北京前门的北京坊劝业场展示YOUGX的最新时装。刘占崑摄一名模特展示YOUG……如何晒太阳才健康晒太阳对于人类的健康非常重要。然而,晒太阳并不是一件简单的事情,因为过度晒太阳可能会导致皮肤癌等疾病。那么,东亚人应该如何晒太阳才能健康呢?下面我将详细介绍。控制晒太阳的……马来西亚国家介绍,有些可能与你知道的不一样!货运全球网,拥有160万外贸发货人,62万国际物流公司,帮助您做外贸!马来西亚是东南亚一个多元文化和多民族的国家,它位于新加坡和泰国之间,面积329,847平方公里。该国……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网