c语言中字符串函数库(C语言中数据结构)
c语言中字符串函数库(C语言中数据结构)
2024-11-22 03:54:03  作者:嗼笵亾粅  网址:https://m.xinb2b.cn/life/nae376856.html

在上一篇我们介绍了,定长顺序串,它缺点很明显,就是一开始必须分配一个足够长度的内存空间,要是用不完,那么就会浪费内存空间,要是初始分配的内存空间不够(如我们需要插入、置换、连接等操作),那么会发生截断,导致数据丢失,这有点不好,今天我们继续介绍数据结构串中的堆串,完美的解决了,定长顺序串存在的问题,它的特点呢,就是仍然以一组连续的内存空间存储字符序列,但是它是根据需要动态的分配内存空间,这就不需要考虑空间够不够用的问题了,下面我们就来介绍堆串的知识。


一、堆串:

既然要动态分配内存空间,那我们就需要用到动态内存管理函数了,前面已经说过,malloc函数、realloc函数、free函数就是动态内存管理函数,我们堆串就需要用到这些函数,首先,我们既然要动态分配内存空间,那么我们就需要一个字符指针,用于指向动态分配内存的首地址,然后,我们需要记录元素长度,整型表示,在这里我们的长度一般等于分配的内存空间长度,因为我们每次分配都会根据需要分配正好的内存空间,不会多也不会少,由上面我们得到堆串结构体,如下:

结构体

成员包含一个字符指针,一个整型变量,很简洁。

下面一个函数我们直接给串赋初值,如下:


串赋值函数

首先初始长度设为0,然后判断hs成员指针变量是否已经被分配内存空间,如果已分配,那么我们需要释放掉这片内存空间,然后在根据需要赋值字符串(ch)的长度,在分配相应的内存空间,while循环来得到需要赋值字符串的长度,然后判断得到的长度是否为0,如果不为0,那么我们就分配length长度的内存空间,然后通过for循环我们为串赋值,注意的是到最后我们需要手动添加空字符,如果为0,我们把串内成员指针初始化NULL。

1、串插入函数:

串插入函数顾名思义,就是将一个串插入另一个串中,因为是动态分配相应的内存空间,所以不需要考虑定长顺序串是否超出初始分配的最大长度的问题,我们先直接看下有关函数:


串插入函数

在函数中我们首先判断插入位置pos合法与否,判断被插入的串hs是否为空,空那就返回1,然后根据realloc重新分配两个串长度之和的内存空间,在这里我不建议使用realloc函数,因为上面的程序一旦分配失败,那么将会丢失掉原来的数据,因此我们可以使用局部字符指针变量,但是在这里为了方便,但是基本思路都是一样的,如果分配成功那么我们就可以使用循环来插入数据,首先我们通过第一个循环让插入位置pos后面的字符向后移动T->length的长度,然后在插入T串的数据,最后我们改变hs->length的数值,在末尾手动添加空字符。

2、删除指定位置的子串:

先看一下有关函数:


删除子串函数

在上面函数中,我们首先声明一个局部字符指针,用以指向后面分配内存的首地址,然后在判断删除的起始位置是否合法,注意pos len不能大于主串的长度,然后分配删除后内存空间长为主串长-len,在判断是否分配成功,不成功返回1,然后往新的内存空间中赋值,先把pos前的字符赋给mid,然后再把pos len位置到后面的字符赋给mid,最后我们改变length的值,注意在mid尾部手动添加空字符,然后现将原来的内存空间是否,再把新内存空间赋给hs->base。

3、定位函数:

该函数的作用是判断一个串,是否是主串的子串,如果是那么返回子串在主串中第一次出现的位置,下面我们看一下代码:


定位函数

上面我们首先判断串是否为空、还有pos序号是否正确,pos序号指代在主串位置pos后面查找是否有匹配的子串,后面我们先声明几个局部整型变量,i、j指代主串与子串的索引,count用作计数器,然后通过while判断是否已经到串最后,然后在通过if-else语句判断是否相等,相等各索引加1,如果计数器count=子串长度说明已找到,那么退出循环返回位置,如果不等,那么i继续增加,j、count置0。

上面就是堆串的一些常用基本操作,当然还有求子串函数、串比较函数等一些基本操作,暂时在这里暂不作讨论,因为这些基本操作很简单,因此暂时介绍到这里。

二、字符串处理函数:

1、strdup函数:

该函数的功能是将字符串复制到新建立的内存空间。

其一般形式是:

char *strdup(const char *s);

参数s是需要复制的字符串。

返回值:返回字符串指针,该指针指向复制后的新字符串地址。

注意:返回的指针指向的新内存地址空间,里面存放的只不过是s的一份拷贝,它们是没有关系的。

范例:


范例

2、strchr函数:

其一般形式为:

char *strchr(const char *s,char ch);

参数:s为要查找的目标字符串,

ch为要查找的字符,当然第二个参数也可以是整型变量。

作用:查找字符ch第一次在字符串s出现的指定位置。

返回值:如果找到则返回指向字符串s中第一次出现指定字符位置的指针。否则返回NULL。

范例:


范例

运行结果:


结果

好了,今天暂时只介绍到这里,下次继续介绍。

  • 日本稀有奇怪的姓氏(日本的这3个姓氏真奇葩)
  • 2024-11-22日本的这3个姓氏真奇葩日本的这3个姓氏真奇葩,听起来像骂人,你都不好意思叫他文/小刘历史解析我们都知道,中国有着几千年的历史文化,这些都是古人智慧的结晶,有些文化我们至今还受其影响,像什么茶文化、戏曲文化、对联文化、书法文。
  • 牙齿保护的日常生活常识(日常保护牙齿的9大妙招有哪些)
  • 2024-11-22日常保护牙齿的9大妙招有哪些牙齿虽小,但它却是人体中最要的器官之一一旦牙齿患上疾病,它不仅会影响到口腔的健康,还会对人体的全身系统造成损伤因此,日常生活中对牙齿的保护是非常重要的日常保护牙齿的9大妙招:1、对于饭菜温度太高导致的。
  • 结束一段没有爱情的婚姻(爱了散了:一段纠结的)
  • 2024-11-22爱了散了:一段纠结的婚姻是什么?如果说在古代,婚姻意味着要遵循纳采、向名、纳吉、纳征、请期、亲迎的“六礼”之仪,要遵从“父母之命、媒妁之言”的规矩那么在当今社会来说,是不是一纸婚约、一场酒席、一次热热闹闹的仪式,就把两个。
  • 二次元冬天冷(二次元很冷但米哈游很热)
  • 2024-11-22二次元很冷但米哈游很热二次元游戏行业风雨飘摇,唯独米哈游屹立不倒?文|星晖编|石灿2022年的国产二次元游戏圈,用冰火两重天来形容并不过分从5月到6月,不下于10款二次元游戏项目走入绝境,老游戏停服,新游戏中止研发一些名字。
  • 狗不理退市根本原因是什么(狗不理正式退市)
  • 2024-11-22狗不理正式退市登陆新三板5年的天津“狗不理”,在数日前提交了申请,并得到了全国中小企业股份转让系统有限责任公司的同意,正式退市据天津狗不理食品股份有限公司日前公告,公司股票自2020年5月11日起,终止在全国中小企。
  • 嘉善长三角一体化缺点(践行长三角一体化发展新使命)
  • 2024-11-22践行长三角一体化发展新使命人民网记者张晓赫余璐实现共同富裕,是一场艰巨而长期的接力赛,既需要“每一棒”奋力跑,也需要领棒者示范跑时间的指针拨回到2019年12月1日这一天,《长江三角洲区域一体化发展规划纲要》发布,明确以上海青。
  • 挑山工笔记(夜读挑山工)
  • 2024-11-22夜读挑山工主播读经典,陪您说晚安,大家好,这里是闪电夜读,我是武城融媒主播武灵志纪录片《大泰山》正在山东卫视热播,今晚,我们一起重温冯骥才先生的文章《挑山工》《挑山工》冯骥才在泰山上,随处都可以碰到挑山工他们肩。
  • 孕妇感冒喉咙痛小妙招(孕妇可以吃胖大海吗)
  • 2024-11-22孕妇可以吃胖大海吗胖大海胖大海为梧桐科植物胖大海的干燥成熟种子胖大海原产于东南亚,中国广东、海南、广西、云南等省亦有栽培,其呈纺锤形或椭圆形,长2~3厘米,直径1~1.5厘米,俗称“大发”,因其一得沸水,裂皮发胀,几乎。
  • 盘点动漫中那些擅长做家务的角色(动漫作品中的五类夫妻档)
  • 2024-11-22动漫作品中的五类夫妻档我们一直都在说,日本动漫的类型真是只有你想不到,没有他做不到的但这也是人们可以实现在现实中无法实现的梦的途径为什么这么说呢?因为动漫中的很多情节是我们有想象过的,但是在现实中却是无法实现的比如说。
  • lgvelvet有面部解锁吗(兑现承诺LGVelvet)
  • 2024-11-22兑现承诺LGVelvetIT之家3月16日消息,LG去年关闭了手机业务,官方承诺将继续为支持的机型推出Android11操作系统更新,并为部分设备提供Android12/13更新根据LG在3月15日发布的公告,LGVelve。
  • 佩内洛普克鲁兹惊艳红毯(被誉为地表最强小三)
  • 2024-11-22被誉为地表最强小三气质美女安吉丽娜·朱莉和佩内洛普·克鲁兹——老一辈的人常说“婚姻不是儿戏”,可是,在复杂的娱乐圈,婚姻就是儿戏在明星繁华的好莱坞,分分合合的情侣也是见怪不怪了但从一而终的真感情夫妻,确实是寥寥无几自古。