字符函数和字符串函数

简介: 字符函数和字符串函数

大家好,我是晓星航。今天为大家带来的是字符函数和字符串函数的介绍!😀

1.求字符串长度的函数

1.1strlen - 求字符串长度

从数组头部计数,直到遇到字符串结束符\0为止,计数结果不包括\0

经典例题:

大家第一次看到这个题可能会认为会返回<。 然后返回的确是>,这是因为strlen返回的结果是一个无符号整形 故-3实际返回的是一个超级大的数值,因此strlen实际返回的是一个大于零的数。

2.长度不受限制的字符串函数

2.1 strcpy - 字符串拷贝

作用:将一个数组的’\0’之前的元素全部拷贝到另一个数组中

若目标空间不可变 则在复制时会发生冲突

在复制时若原数组已有内容 则原内容会放在后面 但打印时只会打印出复制过来的内容 因为printf遇到’\0’则会停下来

头文件:#include <string.h>

参数两个: 接受的参数放在前面 将要传的参数放在后面

返回值:类型为char*

模拟实现:

2.2 strcat - 字符串连接

作用:把arr2的元素追加到arr1的后面

注:追加数组必须以’\0’结尾 被追加数组必须足够大

头文件:#include <string.h>

参数两个: 接受参数的数组写在前面 传参的数组写在后面

返回值:destination字符串的地址

模拟实现:

注:第一个while中的++不能放在*dest后面 如果放在后面的话就回追加到’\0’后面去 打印就看不到了

2.3 strcmp - 字符串比较

作用:比较字符串中对应字符的大小(按ASCII表值进行比较)

 

头文件:#include <string.h>

参数两个: 比较大小的两个数组 位置前后无关

返回值3个:1 - 前面数组大于后面数组 0 - 两个数组相等 -1 - 前面数组小于后面数组

因为这里arr1中a的ASCII码值比arr2中b的ASCII码值小所以arr1小于arr2,返回-1.

模拟实现:

3.长度受限制的字符串函数介绍

3.1 strncpy - 可控的字符串拷贝

头文件:#include <string.h>

参数三个:接受的参数放在前面 将要传的参数放在中间 要拷贝的字符数量写在最后面。

返回值:类型为char*

如果要拷贝的元素个数不足 则将后面不足的元素变成’\0’拷贝过去

3.2 strncat - 可控字符串连接

头文件:#include <string.h>

参数三个:接受的参数放在前面 将要传的参数放在中间 要拷贝的字符数量写在最后面。

返回值:destination字符串的地址

这里虽然指定要连接7个元素 但是arr2只有5个元素 故strncat只连接5个元素

当strncat遇到\0时它直接将它向后移动到arr2数组要连接的最后一个元素处

3.3 strncmp - 可控字符串比较

头文件:#include <string.h>

参数三个:接受的参数放在前面 将要传的参数放在中间 要拷贝的字符数量写在最后面。

返回值:1 - 前面数组大于后面数组 0 - 两个数组相等 -1 - 前面数组小于后面数组

4.字符串查找

4.1 strstr - 字符串查找函数

头文件:#include <string.h>

参数两个:前面放被找的字符数组 后面放找的字符数组

返回值:strstr函数用于判断字符串字符串str2是否为字符串str1的子串,如果是函数返回str2在str1中首次出现的地址,否则返回NULL。

复杂情况实现 被查找函数有3个连续的b 查找函数有2个连续的b

模拟实现:

4.2 strtok - 把一个字符串切割成几个字符串

注:strtok函数找到str中的下一个标记,并将其用’\0’结尾,返回一个指向这个标记的指针。

头文件:#include <string.h>

参数两个:第一个为要分割的字符数组 第二个为分隔符(可多个不一定是一个)

返回值:返回值为char * 类型 。如果找到标记,则为指向标记开头的指针。否则为空指针。

在每分割完一次后字符数组前面都会变为空指针,注意上述符号@和.则为分隔符 它们将被strtok函数改为’\0’ 并将这个字符串分割成3个字符串 但需要调用3次strtok函数

优化后代码:

问题:为什么在第一次strtok使用之后只需要传NULL就可以直接使用?

答:strtok函数的第一个参数不为 NULL ,函数找到str中第一个标记,strtok函数将保存它在字符串中的位置。strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。(strtok函数内部可能有static这样定义的静态变量,在下次使用时值还是不变)


注:一个strtok函数只能切一次,要切n次就要用n个strtok函数。

5.错误信息报告

5.1 strerror - 错误信息报告函数

c语言中规定了一些错误信息 错误码 - 错误信息

strerror - 可以把错误码翻译成错误信息

头文件:#include <string.h> #include <errno.h>

参数一个:errno - c语言提供的全局变量

返回值:将错误产生的错误码翻译成我们能看懂的信息。

6.内存操作函数

6.1 memcpy - 内存数据拷贝函数(不可处理重叠的内存)

例如上图中要传5个整形,字节大小为5x4=20(字节)

头文件:#include <string.h>

参数有三个:分别为 目的地的地址 源头的地址 要传的元素的字节大小(单位是字节)

返回值:该函数返回一个指向目标存储区destin的指针

模拟实现:

注:src指源文件,是source的缩写 dest指目标,是destination的缩写 size_t相当于一个unsigned类型

例题:

提问:问什么返回值不是1 2 1 2 3 4 5 8 9 10

而是1 2 1 2 1 2 1 8 9 10

答:因为拷贝数组的值先被改变了,即原来的345被121先覆盖了。

6.2 memmove - 内存数据拷贝函数(可处理重叠的内存)

头文件:#include <string.h>

参数有三个:接受的参数 要传的参数 要传的参数的字节大小(单位是字节)

返回值:该函数返回一个指向目标存储区destin的指针

该函数相当于时memcpy的升级版主要处理重叠的内存空间的拷贝

模拟实现:

比较拷贝起始位置和目标位置前后关系,如果拷贝在目的地前(dest < src) 那就从 前向后拷

                                       **如果拷贝在目的地后(dest > src) 那就从 后向前拷**

6.3 memcmp - 比较从ptr1和ptr2开始向后的num个字节(可以比较内存)

头文件:#include <string.h>

参数三个: 比较的数组 比较的数组 要比较的字节个数

返回值:第一个数组的num个字节元素大于第二个数组返回<0的数(一般返回-1)

相等返回0
第二个数组的num个字节元素大于第一个数组返回>0的数(一般返回1)

6.4 memset - 改变数组中的n个元素(以字节为单位来修改)

头文件:#include <string.h>

参数三个:被改变的数组的地址dest 要改变的字符c 要改变的字节大小(单位字节)

返回值:指向buffer的指针

补充知识点:

1:链式访问:把一个函数的返回值作为另外一个函数的参数。

2:函数拓展(字符函数)

字符分类函数:

函数 如果他的参数符合下列条件就返回真

iscntrl: 任何控制字符

isspace: 空白字符:空格‘ ’,换页‘\f’,换行’\n’,回车‘\r’,制表符’\t’或者垂直制表符’\v’

isdigit: 十进制数字 0~9

isxdigit: 十六进制数字,包括所有十进制数字,小写字母af,大写字母AF

islower: 小写字母a~z

isupper: 大写字母A~Z

isalpha: 字母az或AZ

isalnum: 字母或者数字,az,AZ,0~9

ispunct: 标点符号,任何不属于数字或者字母的图形字符(可打印)

isgraph: 任何图形字符

isprint: 任何可打印字符,包括图形字符和空白字符

感谢各位读者的阅读,本文章有任何错误都可以在评论区发表你们的意见,我会对文章进行改正的。如果本文章对你有帮助请动一动你们敏捷的小手点一点赞,你的每一次鼓励都是作者创作的动力哦!😘

目录
相关文章
|
8月前
|
C语言
字符函数和字符串函数
字符函数和字符串函数
79 0
|
C语言 Python
字符函数和字符串函数(下)
字符函数和字符串函数(下)
62 0
字符函数和字符串函数(下)
|
C语言
字符函数和字符串函数(下)
字符函数和字符串函数(下)
|
C语言
字符函数和字符串函数(上)
字符函数和字符串函数
|
C语言
详解字符函数和字符串函数-2
详解字符函数和字符串函数
57 0
详解字符函数和字符串函数-1
详解字符函数和字符串函数
51 0
|
编译器 C语言 Python
字符函数和字符串函数(上)
字符函数和字符串函数(上)
58 0
|
存储 安全
常用的字符函数和字符串函数
常用的字符函数和字符串函数
104 0

热门文章

最新文章