当前课程知识点:高级语言程序设计 >  字符串 >  8.2 系统字符串处理函数 >  系统字符串处理函数

返回《高级语言程序设计》慕课在线视频课程列表

系统字符串处理函数在线视频

系统字符串处理函数

下一节:自定义字符串处理函数

返回《高级语言程序设计》慕课在线视频列表

系统字符串处理函数课程教案、知识点、字幕

大家好

本讲介绍系统字符串处理函数

在实际开发中

字符串的应用非常广泛

字符串这种类型的数据有很多运算

常见的运算有

求一个字符串的长度

字符串的复制

比较两个字符串的大小

字符串的连接等

字符串的运算比数值型数据复杂

为减轻编程的负担

提高编程的效率

C语言提供了丰富的字符串处理函数

来实现字符串的运算

可以对字符串进行整体操作

C语言字符串处理函数有很多

上一讲介绍了字符串的输入输出函数

这一讲我们介绍下面4个字符串处理函数

注意要使用其它字符串函数

应包含头文件"string.h"

先来看求计算字符串长度的函数strlen

字符串长度就是字符串中

不包括\0的实际字符的个数

该函数返回值是一个整数

这里定义了一个长度为10的字符数组

初始化后存放了一个字符串“world”

可以用printf语句以%d的格式

输出此字符串的长度

那这个长度是5 6

还是10呢

这个字符串实际字符的个数是5

输出结果是5

不包括空字符

来看例1

这个演示程序

定义了一个字符数组str

用gets函数从键盘输入一个字符串

存在数组中

再用puts函数将字符串的值输出

用sizeof运算符输出字符数组的长度

用strlen函数输出字符串的长度

如果我们输入”Hubei Huangshi”这个字符串

可以看运行结果

数组长度为20

输入的字符串的长度为14

我们还可以输入”Wuhan”

这个字符串存放在这个str数组中

或者输入中文字符串

测测中文字符串的长度

一般一个汉字字符占两个字节

注意数组的长度是不变的

但可以存储不同长度的字符串

无论这个字符串长度究竟是多少

它的最后一个字符

一定是字符串的结束标志’\0’

要注意区分字符数组的长度和字符串的长度

现在来看字符串的连接函数

两个整值型的数据之间

一个常见的运算是相加

字符串这种类型数据不能相加

但是我们经常要将两个字符串连接起来

形成一个新字符串

大家来看一下什么叫字符串的连接

这里有两个字符数组

str1中存放的字符串是”Hello”

而str2中存放的字符串是”World”

调用这个strcat函数呢

就是将str2中的字符串

添加到str1中的字符串的末尾

就是这样的

现在str1中的字符串变成” HelloWorld”

而str2中存放的字符串不变

来看例2

从键盘输入自己的籍贯和名字

试将它们连接在一起成为一个字符串

并输出在屏幕上

定义了两个字符数组str1和str2

用str1存放籍贯

str2存放姓名

调用strcat函数

将姓名连接在籍贯后

再将str1输出

可以将籍贯和姓名连在一起

形成一个新字符串

这两条语句可以用一条语句来代替

用printf的%s格式输出strcat函数值

或者用puts函数输出strcat函数值

现在来看字符串复制函数

这个函数呢

它要求第一个参数必须是字符数组

第二个参数呢

可以是字符数组

也可以是一个字符串常量

定义了两个字符数组str1和str2

这条语句呢

就是将str2的字符串赋给str1中去

这条语句呢

就是将字符串常量”Everybody”赋给str1数组中去

那么在进行字符串复制的时候

要注意复制的方向

就是表示将str2中的字符串

复制到字符数组str1中

注意字符数组str1必须足够大

否则的话

它容纳不下str2中的字符串的话

就会越过str1数组边界

这样导致的后果就是

无论str1数组后面内存中数据是什么

都将被覆盖

这是很危险的

注意strcpy函数不作数组越界检查

可不可以使用赋值运算符来进行整体赋值呢

也就是将str1=str2

或者写成str1=”Everybody”

这样显然是不可以的

因为C语言会把这样的语句解释为

一个指针与另外一个指针之间的赋值运算

而这个str1呢

它是字符数组的数组名

也就说它是一个常量

不是一个变量

它不能作为赋值表达式的左值

来看例3

从键盘输入两个字符串

交换后输出这两个字符串的值

我们可以像交换两个整数一样

交换两个字符串

定义3个字符数组

st1和st2用来存放键盘输入的字符串

数组t用来作字符串交换时的中间桥梁

注意调用strcpy函数的语句格式

要注意复制的方向

先将st1中的字符串赋值给t

再将st2中的字符串赋值给st1

最后将t中的字符串赋值给st2

像交换两个数值型变量一样

最后呢

再来看一下字符串比较函数

字符串能够像整数一样比较大小

我们以前可能只比较过实数的大小

汉字是没有大小之分的

但是在计算机程序里

字符串是可以比较大小的

怎么定义字符串的大小呢

假如现在我们有两个字符串

这两个字符串只有一个字符

大写的A和大写的B

字符在内存里是以ASCⅡ码值存放的

大A的ASCⅡ码值是65

大B的ASCⅡ码值是66

这里我们就说大A这个字符串

比大B这个字符串小

再来看这一对字符串

小a的ASCⅡ码值是97

比大A的ASCⅡ码值大

我们就说小a这个字符串

比大A这个字符串大

如果这个字符串含有多个字符呢

比如一个是”compare”

一个是”computer”

现在要比较这两个字符串的大小

那就逐个字符进行比较

c和c比

o和o比

m和m比

p和p比

如果相等就继续比下去

那么当比到a和u的时候

不相等

那u的ASCⅡ码值比a的ASCⅡ码值大

我们就说字符串”compare”比字符串”computer”小

当出现第一对不相等的字符时

就由这两个字符决定所在字符串的大小

在C语言中要比较两个字符串的大小

可以使用字符串比较函数strcmp

逐个字符去进行比较

如果相等的话就是比较下一个字符

直到遇到第一个不相等的字符为止

然后拿这第一对不相等的字符对应的ASCⅡ码值

求一个差值

将这个差值作为这个函数的返回值返回

也就是这个函数

是返回这一对不相等的字符的ASCⅡ码值的差值

我们来看实例

如果两个字符串是相等时

那么函数返回值等于0

现在字符串”abcd” 小于字符串”abcf”

函数的返回值等于-2

小于0

字符串”abc” 大于字符串”ab”

函数返回值等于99

大于0

字符串”abc” 小于字符串”b”

函数返回值等于-1

小于0

能否直接使用关系运算符

来比较字符串的大小呢

例如这样来比较

str1和str2中的字符串是否相等

这样比较字符串的大小是不可以的

但是拿这条语句在c语言中是合法的

它的作用呢

不是比较两个字符串的大小

而是将str1和str2作为指针来进行比较操作

也就是比较这两个地址的大小

使用字符串比较函数

判断两个字符串是否相等

应该写成这种形式

来看例4

从键盘输入3个字符串

输出最大的字符串

注意在这个程序中

比较字符串大小的写法

定义四个数组

st1,st2,st3分别用来存放输入三个字符串

max数组用来存放最大的字符串

用系统函数来输入字符串

来比较字符串

来给字符串赋值

使得对字符串的操作非常方便

请大家将本程序与我们以前编写的程序

从键盘输入三个整数 求最大的整数

这个程序比较

两者算法思想是一致的

都是用擂台赛算法求最大值

以前编写的程序处理的数据都是数值型数据

现在我们可以像处理数值型数据一样

处理字符串型数据

现在如果我们要求100个字符串中最大的字符串

是否要定义100个一维数组

用99个if语句来求最大字符串呢

显然答案是否定的

我们可以用二维字符数组来表示批量字符串

定义一个大小为20×10的二维字符数组str如下

我们可以把str[0] str[1] str[2]等等

str[19]看作20个长度为10的一维字符数组

每一个字符数组存放一个字符串

可以像对一维数组那样进行批量处理

定义二维字符数组时

第1维的长度表示字符串的个数

第2维长度表示每个字符串长度

这里是二维字符数组a的定义

并且初始化

这是数组a初始化后三个字符串的存储情况

这个二维数组a中

有三个一维数组

a[0] a[1] a[2]

每个都能存放一个长度不超过7的字符串

来看例5

从键盘任意输入多个字符串

编程找出并输出最大字符串

在这个程序里

定义一个20×10的二维字符数组str

最多可以存放20个长度不超过9的字符串

用户每次不一定都有20个字符串

这里定义一个整型变量n

用来存放用户本次运行要输入的字符串的个数

在scanf()函数读入一个整数赋给n之后

紧接着又要读取字符串

此时应该先执行fflush(stdin)

用fflush(stdin)函数来清空输入缓冲区

一个程序里既要输入数值型数据

又要输入字符型数据时

一定要注意清空键盘输入缓冲区

否则会影响数据输入的正确性

用一个循环语句可以实现

从键盘输入n个字符串

用一个循环语句

可以求出这n个字符串中最大的字符串

还是用擂台赛算法

求这一批字符串中的最大字符串

字符串能够进行比较大小的运算

就可以进行排序的运算

下面利用前面学习过的

对实数进行排序的选择法

对批量字符串进行排序

请看例6

这是对存放在二维数组cs的7个字符串

进行排序

这7个字符串是在定义cs数组时

初始化赋值的

本例中是使用选择法

对这7个字符串进行的排序

将这个程序与数组那一章中

对实数进行排序的程序比较

以前我们排序的对象是整数或实数

现在我们排序的对象可以是字符串

现在假如有一个班有30个学生

我们是不是可以对全班学生的姓名进行排序了

请大家自行完成

我们还可以定义一个指针数组

来存放一批字符串

定义指针数组w

指针数组w中的数组元素都是指针变量

数组元素w[0]存放的是字符串常量

"Monday" 的首地址

w[1]存放的是字符串常量" Tuesday" 的首地址

依次类推

这是指针数组w在内存的存储情况图

再来看例7

如果要对存放在指针数组

w中的7个字符串常量进行排序

排序算法也可以是用选择法

和例6相比

就是字符串的存放方式不同

交换w数组元素时

中间变量是用字符指针变量

排序后字符指针数组

w存储的7个字符串

在内存的存储情况如图所示

字符串常量的首地址

在排序前后没有改变

指针数组元素指向的字符串改变了

w[0]指向了最小的字符串常量

小结一下

我们本讲介绍了

对字符串类型数据常见的运算

求最大字符串呀

对一批字符串进行排序等等

请大家将数值类型的数据

与字符串类型的数据进行比较

区分它们的相同点和不同点

好了 这就是我们这一节的内容

谢谢大家

高级语言程序设计课程列表:

程序设计和C语言

-1.1 计算机程序和计算机语言

--计算机程序和计算机语言

--致敬先辈:伟大的C语言之父——丹尼斯·里奇 程序员

-1.2 C程序的构成

--C程序的构成

--当前主流程序设计语言各自都有什么优势?

-1.3 C语言编辑、编译、运行(VC++2010学习版)

--C语言编辑、编译、运行(VC++2010学习版)

-练习题

顺序结构程序设计

-2.1 变量的定义和使用

--变量的定义和使用

-2.2 数据类型

--数据类型简介

--整型数据

--实型数据

-2.3 格式输出和格式输入

--格式输出printf函数

--格式输入scanf函数

--单个字符的输入输出

-2.4 运算符和表达式

--运算符和表达式

-2.5 结构化程序设计入门

--结构化程序设计入门

-练习题

选择结构程序设计

-3.1 为什么要用选择结构解决问题

--为什么要用选择结构解决问题

-3.2 如何正确表示选择结构中的条件

--如何正确表示选择结构中的条件

-3.3 用if语句及if语句嵌套实现选择结构

--用if语句及if语句嵌套实现选择结构

-3.4 用switch语句实现选择结构

--用switch语句实现选择结构

-练习

循环结构程序设计

-4.1 循环的引入

-- 为什么要用循环结构解决问题

-4.1 循环的引入--作业

-4.2 用while语句实现循环

--用while语句实现循环

-4.3 用do-while语句实现循环

-- 用do-while语句实现循环

-4.4 用for语句实现循环

-- 用for语句实现循环

-4.4 用for语句实现循环--作业

-4.5 何时需要用循环的嵌套

--何时需要用循环的嵌套

-4.6 如何提前终止循环和提前结束本次循环

--如何提前终止循环和提前结束本次循环

-习题--作业

数组

-5.1 数组类型的引入

--数组类型的引入

-5.2 一维数组的定义和初始化

--一维数组的定义和初始化

-5.3 一维数组的使用

--一维数组的使用

-5.4 二维数组的定义和初始化

--二维数组的定义和初始化

-5.5 二维数组的使用

--二维数组的使用

-习题--作业

指针

-6.1 什么是指针

--什么是指针

-6.2 指针类型及相关概念

--指针类型及相关概念

-6.3 指针变量的定义、赋值与使用

--指针变量的定义、赋值与使用

-6.4 指针的运算

--指针的运算

-6.5 指针与一维数组

--指针与一维数组

-6.6 指针的指针

--指针的指针

-6.7 指针与二维数组

--指针与二维数组

-习题--作业

函数

-7.1 为什么要自定义函数

--为什么要自定义函数

-7.2 函数的定义

--函数的定义

-7.3 函数的调用

--函数的调用

-7.4 函数参数的传递

--函数参数的传递

-7.5 函数的嵌套调用和递归调用

--函数的嵌套调用和递归调用

-7.6 变量的作用域和存储类型

--变量的作用域和存储类型

-习题--作业

字符串

-8.1 字符串的存储及输入输出

--字符串的存储及输入输出

-8.2 系统字符串处理函数

--系统字符串处理函数

-8.3 自定义字符串处理函数

--自定义字符串处理函数

-习题--作业

结构体和共用体

-9.1 结构体类型的定义

--结构体类型的定义

-9.2 结构体变量及指针变量的定义及使用

--结构体类型变量和指针变量的定义和使用

-9.3 结构体变量和指针变量作函数的参数

--用结构体变量和指向结构体的指针作函数参数

-9.4 结构体数组的定义和使用

--结构体数组的定义和使用

-9.5 共用体类型和枚举类型

--共用体和枚举类型

-习题--作业

动态内存分配

-动态内存分配--习题

文件

-习题--作业

系统字符串处理函数笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。