网站首页 > 技术文章 正文
C语言字符串作为一种数据类型,是最为常用的一种操作对象,它的用法和基本类型int、char、double等不太一样,常用的操作也不是+、-、*和/等操作符,而是诸如合并两个字符串为一个新的字符串、将一个字符串删除首部或尾部指定数目的字符、将一个字符串按照指定次数进行合并以及分割字符串为等长的字符串操作,这些操作可以说是与整型的操作符类似,但含义有所改变,下面我们就学习如何实现这几个常用的功能。
在开始学习以上4个字符串操作之前,首先介绍两个重要的概念,一个是逐个字符依次访问字符串,另一个是字符串长度。
逐个地访问字符串中的字符,就是从字符串的起始地址开始,每次将访问的地址向后移动一个单元,我们可以通过一个指针的递增操作符实现,这样就可以访问到新的地址,之后通过指针间接操作符*,就可以访问这个地址所存储的字符了。例如,将指针p指向字符串s的第一个位置,p = s,我们就可以使用*p访问字符串变量s的第一个字符;之后将指针向后移动一位,即指针p递增操作,p++,再通过*p访问的内容就是s字符串中的第2个位置的字符,依次类推,就可以访问字符串中的每一个字符,直到遇到字符串终止符’\0’为止。
字符串的长度,以ASCII字符编码为例,是指这个字符串中所有字符的个数总和。比如:字符串”Live or die?”的长度为12,字符串长度包括引号内的所有字符,当然也包括空格字符和符号字符,如上例中的的两个空格和一个问号字符。我们该如何计算字符串的长度值呢?长度值的计算是通过起始点和终止点,对于字符串来说,就是字符串的起始地址和终止地址,起始地址表示为字符数组的变量名称,终止地址就是特殊字符’\0’所在的地址。如下面的字符串:
我们就可以从第一个字符L开始计数,之后向后移动一个位置,每次移动一个位置,字符的个数加1,直到遇到最后一个字符’\0’为止(’\0’不计入字符串的长度),代码可以这样编写:
图2中第6行代码将指针的值设置为字符数组变量s,即将指针变量p指向了字符串的起始地址,之后将字符串长度计数变量count初始化为0,之后每次递增一个位置,count的值就增1。第8-11行使用了一个循环语句,这个语句的循环终止条件为*p == ‘\0’,即当前的字符为’\0’,如果*p值为其它字母,那么将一直执行代码第9、10行代码,第9行代码递增count的值,第10行递增指针p的值,如果遇到了特殊字符’\0’,那么while循环语句就停止执行,count变量中就记录下字符的个数,即计算出这个字符串的长度。
字符串拼接功能,是指将两个字符串a和b中的字符进行拼接,形成一个新的字符串c。比如:a字符串内容为”abc”,b字符串的内容为”def”,执行字符串拼接后形成的新字符串为”abcdef“。下图3实现了字符串拼接功能,拼接字符串时,原字符串a和b中的数据保持不变,将拼接后的字符串存放至新的位置,字符数组c变量为这个位置的起始地址,需要注意的是:字符数组c所占用的空间大小一定不小于字符串a和b的长度之和再加1(用以存储字符串终止符’\0’)。
在图3的代码中,第19-21行,定义了三个指针,分别指向三个数组a,b和c的首地址,代码第23-27行实现将字符串a中的字符逐个复制到数组c中,代码采用的是通过指针逐个访问字符串a中的字符,并对c数组中的对应位置进行赋值,每次复制一个字符到c数组中;采用同样的方法,代码第29-33行,实现对字符串b中的字符依次复制到数组c中,当前的指针pc在完成对字符串a的复制操作后,位置停留在第4个位置,这样在进行对b字符串进行逐个访问时,新的字符便会追加到已包含a数组数据的c数组的最后。完成对字符串a和b的复制操作后,第35行代码执行了一个赋值操作,将数组c的最后一位设置为’\0’值,即构造称为一个字符串。第37行代码输出了表示a和b字符串合并后的结果。
删除一个字符串首部指定个数的字符是指将一个字符串的最左端的从现有字符串移除,如源字符串”abc efg hijk lmn”,删除首部4个字符后,新的字符串变为了”efg hijk lmn”。如何进行操作呢?我们只需要将第4个位置后的所有字符依次向前移动4个位置就可以。
图4代码中,第41行将指针ps指向第5个元素’e’所对应的地址,第42行代码将指针ps0执行原字符串的首地址。通过第43-47行代码中的循环语句,依次将第5个位置之后的代码前移4个位置,即’e’移至0位置,‘f’移至1位置,‘g’移至2位置……,最后将’n’移至11位置,代码第44行实现此功能,第45行代码是将新字符串的指针向后移动一个位置,第46行代码是将旧字符串的指针向后移动一个位置,即两个指针始终保持距离为4的偏移,最终实现移动所有字符。第49行代码是将字符出终止符添加到末尾,形成一个新的字符串。这样就完成了从起始位置删除4个字符的功能。
如何删除字符串尾部指定数目的字符呢?见《字符串基本操作之二》
- 上一篇: C语言字符串和字符数组,简单了解下
- 下一篇: 「C语言初级」.字符串基本操作之二
猜你喜欢
- 2024-10-05 Python基础知识——字符串(python字符串的常用方法)
- 2024-10-05 你会在 Python 中使用字符串吗?(python字符串需要用什么包裹)
- 2024-10-05 javascript内置对象总结 - String
- 2024-10-05 Python 中字符串和字符串处理的综合指南
- 2024-10-05 C++中的string用法(c++ string用法总结)
- 2024-10-05 Excel文本函数——CONCATENATE函数详解
- 2024-10-05 探究C语言中字符串大小和长度易错点
- 2024-10-05 【PythonTip题库300题】第47题:字符串中缺失的字母
- 2024-10-05 Rust: 字符串总结,虽常见但非常重要
- 2024-10-05 这些字符串处理函数你用过吗(字符串常用操作函数)
- 08-03MySQL数据库的预处理详解
- 08-03《阿常·MySQL 70讲》全套教学视频
- 08-03隐式等待、显示等待和强制等待
- 08-03零基础C#上位机框架项目实例(完结篇)
- 08-03一文搞懂构建Web内容的技术
- 08-03西门子WINCC中的VBScript(VBS)常用于自动化脚本开发
- 08-03力控和sql2000之间的数据转储
- 08-03组态王|通过日历控件选择时间段查询历史报警
- 1521℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 627℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 527℃MySQL service启动脚本浅析(r12笔记第59天)
- 492℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 492℃启用MySQL查询缓存(mysql8.0查询缓存)
- 479℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 461℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 458℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- htmlbackground-image (68)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)