目录
代码实现
前言
本文主要介绍处理字符和字符串的库函数的使用和注意事项
及模拟实现各函数
函数目录
-
求字符串长度
- strlen
-
长度不受限制的字符串函数
- strcpy
- strcat
- strcmp
-
长度受限制的字符串函数介绍
- strncpy
- strncat
- strncmp
-
字符串查找
- strstr
- strtok
-
错误信息报告
- strerror
C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在 常量字符串中或者字符数组 中。 字符串常量适用于那些对它不做修改的字符串函数。
函数介绍
strlen
作用:
求字符串长度
上图是MSDN上关于strlen的相关信息,首先我们可以看出函数返回类型为size_t也就是无符号类型,并且是函数是传的字符串的地址。
函数的使用
strlen函数注意事项
strlen模拟实现
strcpy
作用:
将源字符串拷贝到目标字符串中去
从图中可以看出strcpy的作用就是拷贝字符串,调用strcpy时要引头文件<string.h>,函数传参类型都是char*,而源字符串那加上const是因为源字符串不需要改变,加上const增加代码的健壮性。然后函数的返回类型也是char*
函数的使用
这样无法确切的看出函数的返回值、返回类型,所以我迷你实现了一下strcpy
strcpy模拟实现
assert简单介绍
可能有的同学不知道这个是什么,我给大家说一下,assert简称断言,作用就是检查函数传递过来的指针是否合法,是否为空,要是为空指针或者不合法就会报错,程序在这里就直接挂掉了,相当于给代码加了一层保障。
strcpy函数注意事项
- 源字符串必须以 ‘\0’结束
- 会将源字符串中的 ‘\0’ 拷贝到字符串
- 目标空间必须足够大,以确保能存放源字符串
- 目标空间必须可变
strcat
作用:
将源字符串追加到目标字符串后面
效果如下:
和strcpy类似,strcat也是差不多的函数设置
strcat函数注意事项
- 源字符串必须以 ‘\0’结束
- 目标空间必须可修改
- 目标空间必须足够大,以确保能存放源字符串
strcat模拟实现
strcmp
作用:
比较两个字符串
看看MSDN上对于strcmp的描述
要是字符串1比字符串2小那么返回一个 <0 的数
要是字符串1比字符串2大那么返回一个 >0 的数
要是字符串1和字符串2一样大那么返回 0
strcmp函数比较的是字符串对应位置上字符的ASCII码值
函数使用效果:
对照上图代码,可以发现str1与str2第三个字符分别为c和d,而c与d相比c的ASCII的要小,所以返回了一个小于0的数-1。
strcmp模拟实现
因为str1第三个字符c小于str2第三个字符d,所以输出 <
strncpy
作用:
拷贝count个字符从源字符串到目标字符串中去
效果如下:
可以看到因为我传的count为3,所以strncpy把str2的前三个字符ijk拷贝到了str1的前三个字符abc上去,并且把abc三个字符覆盖掉了,然后打印出来。
但是如果源字符串没有你想要拷贝数那么多的字符数就会在内存中把其置为 '\0' ,我们看到的就是多的被置为了0。举例如下:
通过监视我们可以看到因为str2只有三个字符,所以下标为3和4的位置被置为了 '\0'
size_t是无符号的数
strncpy模拟实现
strncat
作用:
与strcat一样都是追加字符串
看了代码再来看一下基本语法:
strncmp
作用:
与strcmp一样都是比较字符串的大小,但是strncmp可以指定比较字符串中比较多少个
返回值都和strcmp的规则一样,就是多了一个参数count
代码实现如下:
strncmp模拟实现
strstr
作用:
找一个字符串中是否存在名一个字符串,也就是子串,类似于数学上的找子集
上图大意是:函数返回一个指向主字符串在子串中首次出现的指针,如果子串没有在主串中出现的话返回NULL,如果子串指向长度为0 的字符串,则函数返回主串。
代码实现