百摩网
当前位置: 首页 生活百科

c语言字符串读取方法(.字符串基本操作之二)

时间:2023-05-30 作者: 小编 阅读量: 1 栏目名: 生活百科

我们还是以字符串”abcefghijklmn”为例,删除尾部4个字符串,得到新的字符串内容为”abcefghijk”。我们通过观察删除字符的操作前后字符在内存中的存储情况有什么区别。新生成的字符串长度变为了40。字符串分割操作是指将字符串按照指定的字符分割为多个字符串。以字符串“abcefghijklmn”为例,采用空格字符进行分割后,形成4个字符串“abc”,”efg”,”hijk”和”lmn”。

如何删除字符串尾部指定个数的字符呢?我们还是以字符串”abc efg hijk lmn”为例,删除尾部4个字符串,得到新的字符串内容为”abc efg hijk”。我们通过观察删除字符的操作前后字符在内存中的存储情况有什么区别。下面图1表示删除之前的字符存储情况,图2表示删除之后的状态,红色标示的字符为待删除的内容

图1

图2

比较图1和图2中的数据,图2中的红色内容被“删除”了,或者说是新的字符串已经不再包含所有12-15中的字符。如何让这个新字符串不再包含这些内容呢?根据字符串可以视为一系列内存中的字符,直到含有一个特殊字符’\0’,即表示这个字符串结束了。也就是说在将字符串结束符’\0’设置在特定位置就可以改变这个字符串的长度,我们再以上面的例子进行说明,删除字符串末尾的后4个字符

图3

图3中绿色单元格所对应的内存位置之前所有的数据就是我们删除尾部4个字符后想要的结果,在这个图3中可以清晰地看到,删除字符串末尾4个字符,实际执行的操作就是将字符串末尾倒数第4个位置的字符值设置为字符串终止符’\0’,这样做的话,’\0’字符之后的内容与这个字符串已经没有关系了。

图4

图4中的代码第53行创建一个变量lenOfSt,表示字符串st的原始长度,现在需要删除字符串末尾4个字符(最右端字符” lmn”),通过第54行代码16 – 4计算出字符串终止符’\0’相对字符串起始地址的偏移量为12,那么st[12]就是字符’\0’的新位置,图3中绿色单元格所对应的内存位置,之后将这个地址所对应的内存单元设置为’\0’字符,完成字符串尾部删除4个字符的功能。

和其它内置类型的*操作符相比,字符串也可以定义类似的功能,但需要重新定义下它的含义为一个字符串的重复拼接操作。比如字符串“Oh, yeah! ”,这个字符串的长度为10,最后一位字符为空格,重复4次进行拼接后,其结果为“Oh, yeah! Oh, yeah! Oh, yeah! Oh, yeah! ”新生成的字符串长度变为了40。代码其实是通过字符串拼接和循环语句就可以实现,重复的次数就是要拼接原字符串的个数,比如本例中重复次数为4,每一次循环操作都是从原字符串的第一个字符开始,直到最后一个字符。代码实现为:

图5

图5第57行代码初始化一个字符串ts,长度为10,第58行代码定义了存放新生成的字符串的字符数组,数组大小为41。即4个长度为10的字符串占用的空间大小为40,还有一个存储字符串终止符’\0’的1个位置,因此整个存放生成的新的重复字符串的数组大小为41。

代码第60行代码初始化字符指针pts4指向ts4数组的首地址,第61-69行代码为整个for循环语句,它是一个两层嵌套循环语句:外层循环语句控制重复字符串的次数,内层循环实现对原字符串从0至最后一个字符的复制功能。

本例中需要注意的地方在于两个指针pts4和pts的初始化位置,pts4指针的初始化对应第60行代码,位于外层循环语句之外,但递增的位置在第67行,也就是说,在整个循环中pts4的指针是一直处于递增状态;但是对于指针pts来说,它的初始化位置是在第65行,位于外层循环语句体内,即每一次外层循环就会将指针pts设置为ts字符串的首地址,在内层循环中复制内容时pts都是从字符串ts的首地址开始,直至遇到’\0’便终止内层循环,内层循环执行完毕一次,就会复制一个字符串ts到目标ts4地址内存中。

字符串分割操作是指将字符串按照指定的字符分割为多个字符串。以字符串“abc efg hijk lmn”为例,采用空格字符进行分割后,形成4个字符串“abc”,”efg”,”hijk”和”lmn”。我们还是通过字符在内存中的存储状态来分析如何对字符串进分割,原始字符串在内存中的表示为:

图6

图6为原始字符串在内存中的表示方式,一共含有16个字符和一个字符串终止符’\0’,如果将原始字符串采用空格字符进行分割,那么将会得到如下图所示的4个字符串:

图7

图7中连续的绿色单元格所表示的为一个分割后的独立字符串,即采用空格分割后,我们可以得到4个对应的字符串,这只是分析后所期望得到的结果。而实际上,我们如何将这些绿色单元格中的数据表示为一个合法的字符串呢?结合字符串定义,他首先需要一个内存中的起始地址,之后还需要一个字符串终止符’\0’。结合本实例来说的话,第一个字符串”abc”的首地址就是字符’a’所对应的地址,字符’c’之后的空格的位置上设置为字符串终止符’\0’就可以正确的表示第一个字符串“abc”了。依照此方法,同样可以表示出第二个”efg”和”hijl”字符串,而最后一个字符串只需要表示出它的’l’字符所对应的地址就可以了,原字符串的终止符就是新生成的最后一个字符串”lmn”的终止符。整个构建完成之后,各个字符在内存中的表示变为了下图所示

图8

如何通过代码实现呢?分为两个步骤进行操作,第一个步骤是先将原字符串中的空格字符转换为字符串终止符’\0’,第二个步骤是获取每一个字符串的首地址,输出其对应的字符串即可。第一个步骤只需要使用一个循环语句,依次访问字符串中的每一个字符,判断这个字符是否为空格,如果为空格,直接将这个位置的字符设置为字符’\0’,如下代码所示

图9

执行完空格字符转为终止字符之后,原来的字符串在内存中的存储方式变为了图8所示的状态,接下来需要输出这些字符串内容。因为现在内存中存在多个字符串,无法使用数组首地址spt变量输出全部字符串,spt变量现在只表示一个字符串”abc”,因此,在输出对应的字符串时,需要计算出每个字符串的首地址在哪里。

图10

在计算每一个字符串的首地址时,我们首先限定了字符串首地址查询地址的范围,即首地址为spt数组的首地址,最大地址为sptsizeof(spt)所对应的地址,即原字符串中’\0’字符所存在的地址。之前我们介绍过sizeof操作符的用法,但是,它的操作数为数组名称还是第一次使用,它的含义是计算这个数组的大小,对于图9中第91行代码的用法,其对应的代码可以视为:

char spt[] = {‘a’,’b’,’c’,’ ‘,’e’,’f’,’g’,’ ‘, ‘h’, ‘I’, ‘j’, ‘k’, ‘ ‘, ‘l’, ‘m’, ‘n’, ‘\0’};

sizeof(spt)的数值为17,这个值比字符串spt的长度值大1(多出一个字符’\0’的位置)。

设置了字符串地址的范围之后,我们需要给出这个字符串对应的首地址是什么以及这个字符串在什么情况下进行输出。对于字符串首地址问题,图10中的代码中第103行,将word字符指针指向了pspt指针,此时pspt指针指向pst数组的首地址,也就是说word指针指向了pst字符串的首地址,代码中第107行,表示的是更新word指针指向的内容,更新的前提条件为第105行代码中*pspt为’\0’字符时,即pspt指向一个字符串终止符’\0’时,才会更新word指针的内容,再次之前的前一句代码第106行输出了当前word指针所指向的内容,执行完第107行代码后,word的指针变为了新的字符串对应的首地址。代码104-110代码循环执行完成之后便可以输出所有的分割后的字符串。

至此为止,我们已经实现了字符串几个常用的操作,每一个操作的基本思路就是分析原字符串和对应的目标字符串,找出从原字符串到目标字符串转换的方法,通过操作内存中的数据即可。C语言标准库中提供了更为广泛的字符串操作函数,比如strlen可以计算字符串长度,strcat可以进行字符串拼接操作等,实际项目中尽可能的采用C语言标准库中已有的函数,可以保证代码的质量和效率,本文中实现的字符串操作功能主要是为了,在C语言标准库中没有对应的函数可以解决问题时,我们应该如何通过自己的分析去解决字符串问题,从而实现自己想要的字符串操作功能。

    推荐阅读
  • 马头岩是不是三坑两涧(名岩产区三坑两涧)

    武夷山坐落在福建省东北部,有“奇秀甲于东南”之誉。这里是武夷山景区中心,亦视武夷岩茶的核心产区,古时称“正岩茶”便产于此处,而周边的岩茶古时称“半岩茶”。慧苑坑慧苑坑位于玉柱峰北麓,是武夷山岩茶产区中核心地带,是武夷山岩茶三坑两涧之一。炎炎夏日,途径流香涧和悟源涧,会有一种恍如隔世之感。三坑两涧,武夷岩茶友们心目中圣地所在,独特的山场气息令人回味无穷,经久不衰。现在国家标准称统一为名岩产区.

  • 如何做油煎肉丸(油煎肉丸如何做)

    如何做油煎肉丸猪肉400克,盐适量,生抽半勺,料酒少许,糖少许,胡椒粉适量,花椒粉适量,鸡粉适量。把猪肉和少许水一起倒入米厨破壁机内,选择酱料程序,设定时间为10秒,启动。完成后就是非常细腻均匀的肉泥了。在肉泥中加入盐、生抽、料酒、糖、白胡椒粉、花椒粉、鸡粉,搅匀静置片刻。电烤锅的丸子盘刷少许油,预热后用小勺将肉泥舀入其中。开大火,一面煎至定型后,翻面,煎两三分钟,把两面都煎成红褐色即可。

  • 女人喝红茶有什么好处(女人喝红茶好处介绍)

    女人喝红茶有什么好处排毒,红茶中含有咖啡碱,可增加肾脏的血流量,提高肾小球滤过率,从而促成尿量增加,有利于及时排出体内多余的盐分、有害物、毒素等。护齿,红茶中含有氟,氟离子能和牙齿的钙质形成一种难溶于酸的氟磷灰石,可起到保护牙齿的作用。而黄酮类相当于氧化剂,所以女性喝红茶,还具有延缓衰老的好处。提神,茶中均含有咖啡因,具有兴奋大脑神经中枢的作用,可帮助消除疲劳,有很好的提神效果。

  • 无根草泡水可以长期喝吗(无根草泡水能不能长期喝)

    下面更多详细答案一起来看看吧!无根草泡水具有清热解毒、凉血利水的功效。可以补肾益精,改善患者肾虚的症状,无根草泡水可以辅助治疗一些慢性疾病,比如糖尿病、泌尿系统感染等。对于女性妇科疾病,具有很好的治疗作用,改善崩漏、白带异常等疾病。对于肾精亏损的症状,具有很好的改善作用,缓解腰膝酸软的症状,对于老年人大小便失禁有很好的治疗作用。需要注意的是,孕妇不能使用。

  • 描写夏天的古诗你知道哪些(60首描写夏天的古诗词)

    夏季是一年四季中的第二个季节。按照二十四节气来划分,夏季从立夏开始,到立秋结束。到了夏季,我国大部分地区天气炎热,气温较高。北方气候特征是干燥炎热,南方气候特征则是湿热多雨。到了夏季,由于光照充足、雨水充沛,农作物到了生长的旺盛期。到了炎炎夏日,树叶浓密发绿,树木郁郁葱葱、青翠欲滴。为了享受凉风的舒爽,人们吃完晚饭后,纷纷从家里出来,到公园、凉亭、广场上散步纳凉。

  • 灵越7700一体机评测(畅玩游戏颠覆认知)

    灵越7700一体机评测众所周知,电子竞技已经成为一个体育项目,并且已经确定成为亚运会正式比赛项目,将参与2022年杭州亚运会。这个消息想必颠覆了传统家长们以往对于玩游戏是“洪水猛兽”的认知。PC游戏的持续火热,也进一步说明了人们对其的接受程度越来越高。海兰A700电竞一体机外观设计具备非常炫酷的电竞风格。海兰A700电竞一体机内置大叶片静音风扇搭配铜管导热,急速散热的性能可保证顶级配置的流畅运行前提,无惧高压挑战。

  • 炸蘑菇用淀粉还是面粉(炸蘑菇用什么粉)

    炸蘑菇用淀粉还是面粉炸蘑菇可以不用面粉,直接用鸡蛋和淀粉代替面粉就行,都是为了糊住蘑菇方便炸,这样做味道更好了。玉米淀粉口感温涩,不属于最佳。如果采用玉米淀粉也是可以的。其实最好使用狮球粉,酒店一般都是这。先将蘑菇撕成细条,下水焯一下。如果直接炸会有一种杂草的味道)将蛋清倒入碗内,用筷子顺一个方向连续抽打起泡沫,再加干淀粉、葱姜、盐、味精。乃顺同一方向搅拌均匀,制成蛋泡糊,直到能立住筷子为止。

  • 最小公因数是什么意思(最小公因数解释)

    接下来我们就一起去研究一下吧!最小公因数是什么意思最小公因数就是两个数同时可以除以的最小的数。公因数,亦称“公约数”。它是一个能同时整除若干整数的整数。如果一个整数同时是几个整数的因数,称这个整数为它们的“公因数”,公因数中最大的称为最大公因数,最小的即是最小公因数。

  • 我敢保证98%的直男都不知道卧蚕是什么,

    今年情人节最佳礼物诞生了那就是

  • vac还能打游戏吗(不作死就不会死)

    刚刚韩国一名土豪玩家的steam帐号由于被V社的VAC系统检测到有不良游戏行为遭到封禁,其CSGO游戏内库存极尽奢侈,皮肤总价值经粗略估算已超过10W。三小时前刚被封禁仅一把纪念品龙狙市场售价便已超过3W64把匕首,大部分都是红网、宝石等高配匕首光这一张14年卡托维兹全息IBP贴纸都价值过万对于这名韩国玩家小编只想说一句话,不作死就不会死啊!V社的VAC机制再一次让我们见识到了G胖的对于游戏平衡性的坚决维护。