C语言——字符函数和字符串函数

1.assert断言(判断程序运行时是否符合条件)

0de0467d3af7474d87f89b2650b5f374.png

<assert.h>头文件定义了宏assert(),⽤于在运⾏时确保程序符合指定条件,如果不符合,就报 错终⽌运⾏。这个宏常常被称为“断⾔”

assert() 宏接受⼀个表达式作为参数。如果该表达式为真(返回值⾮零), assert() 不会产⽣任何作⽤,程序继续运⾏。如果该表达式为假(返回值为零), assert() 就会报错,在标准错误流stderr 中写⼊⼀条错误信息,显⽰没有通过的表达式,以及包含这个表达式的⽂件名和⾏号。

assert() 的使⽤对程序员是⾮常友好的,使⽤ assert() 有⼏个好处:它不仅能⾃动标识⽂件和出问题的⾏号,还有⼀种⽆需更改代码就能开启或关闭 assert() 的机制如果已经确认程序没有问题,不需要再做断⾔,就在 #include <assert.h> 语句的前⾯,定义⼀个宏 NDEBUG 。然后,重新编译程序,编译器就会禁⽤⽂件中所有的 assert() 语句。如果程序⼜出现问题,可以移除这条 #define NDBUG 指令(或者把它注释掉),再次编译,这样就重新启⽤了 assert() 语句。

assert() 的缺点是,因为引⼊了额外的检查,增加了程序的运⾏时间。⼀般我们可以在 Debug 中使⽤,在 Release 版本中选择禁⽤ assert 就⾏,在 VS 这样的集成开发环境中,在 Release 版本中,直接就是优化掉了。这样在debug版本写有利于程序员排查问题,在 Release 版本不影响⽤⼾使⽤时程序的效率。

1fdf8f5fb48247cd8f126c7db45cc922.png

2.字符函数

头文件<ctype.h>

基本格式:

9aa6158516b04ddaa382164094802083.png

1.字符分类函数

符号条件返回非0,不符合条件返回0。

132c253c03d6407fbe8e49631a1d5352.png

2.字符转换函数

c435cb3d48b7408eb1f8e3c17de86b08.png

示例:

30c91d8e5998468a924c71fd0b6f43e5.png

3.字符串函数

3.1 strcpy函数

1.头文件 <string.h>

2.基本格式

89d00f8947cc4eb7a71a1f1e3db87fdc.png

将源头source中的字符串拷贝到目的地 destination 目标数组中,包括 null 字符(并在该点停止)

源字符串必须以 '\0' 结束。

目标数组必须足够大。

目标数组必须可修改。源字符串不可修改。

53d5657440c440048bb87d81fa5cbc12.png

f6441adffe194867a34591c3a96a9342.png

模拟实现:

f4bf24b9f1f546579ec87765ee18e5b3.png

3.2 strcat函数

头文件<string.h>

基本格式:

d6ccfd1654d94ef3b2add2575617e197.png

将源字符串中的字符连接到目标字符串中,目标字符串中的终止字符 null 将会被源字符串中的第一个字符所覆盖,源字符串中的终止字符 null 也要连接到目标字符串中。

源字符串中必须包含 '\0' 。

目标字符串必须包含 '\0',否则不知道连接从哪里开始。

目标空间必须足够大,可以容纳下源字符串中的内容。

目标空间必须可修改。

目的地和来源不可以重叠。否则将会造成字符串无限连接,直到栈溢出。

3f25d8d466534c36ae3aa3d8c5f1da67.png

62545368778a4382a79a555514cce6d3.pnga4ef943b1db649d893d2c654e13c7552.png

0cb1aeb548e54b918f9b84b1fce367ba.png

模拟实现:

9c522750b1104047a7ccb6b73ab0e3d6.png

3.3 strcmp函数

比较两个字符串的大小

头文件<string.h>

81e438e502054cad92fc7e6bdc5d7afa.png

从第一个字符开始按 ASCLL 码值将两个字符串的字符逐个进行比较,如果相同,则继续执行下一对,直到遇到字符不同或 \0 停止。

如果 str1 > str2 则返回值 >0

如果 str1 == str2 则返回值 ==0

如果 str1 < str2 则返回值 <0

a682c00629fc40bb8a50945fe0a4983d.png

模拟实现:

6fdd11651c6a4e77ba19f0566752b892.png         a4946bb28c884b309fbac1736f608979.png

3.4 strncpy函数

1.头文件<string.h>

2.基本格式:

294d96f518fd4444b1b3b27bbc407466.png

将源字符串的前num个字符拷贝到目标空间中

1.如果在拷贝num个字符之前就找到源字符串的末尾(null),即source的长度小于num,则剩余字符将用零填充,直至将num个字符拷贝到目标空间中。

2.如果source的长度大于num,则不会在目标空间末尾隐式附加 null 字符。因此,在这种情况下,destination 不应被视为以 null 结尾的字符串(这样读取时它会溢出)。

目标空间必须足够大,可以容纳下要拷贝的字符串

目标空间必须可修改,源字符串不可修改。


目的地和来不得重叠

当src和dest指向的内存区域有重叠时,直接的字符复制可能会导致数据被提前覆盖,从而引发错误。

95abb288d5c24b87a20c89c9bf7a5d9d.png

模拟实现:

 

46437af28e494e0283ef6df8733ba112.png

3.5 strncat函数

1.头文件 <string.h>

2.基本格式:

840c825e39d04119881685fc3a2001a0.png

1.将源字符串的前 num 字符追加目标空间后,加上一个终止的 null 字符。

2.如果源 字符串的长度小于 num,则仅复制终止 null 字符之前的内容,之后再加上一个终止的 null 字符。

目标应该足够大,可以容纳下连接的num个字符

目标字符串必须可修改,源字符串不可修改

目标字符串必须包含终止字符 '\0',否则不知道连接从哪里开始

7f126cdba4d9427f94f8f4aaad0f4885.png

83a3cff250934f548c711bcd17b98858.png

模拟实现:

49985d4cbefd44a990b2e2c6e11e34ac.png

3.6 strncmp函数

1.头文件<string.h>

2.基本格式:

dbcb1f909634466b94ad9d974db3a952.png

此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续执行以下对,直到字符不同,直到达到终止的 null 字符,或者直到两个字符串中的 num 个字符匹配,以先发生者为准。

如果 str1 > str2 则返回值 >0

如果 str1 == str2 则返回值 ==0

如果 str1 < str2 则返回值 <0

509faf57dc6347bbbbfb690873ce8839.png

模拟实现:

bc0fa0f3fbcd445d925fb8844b7402bd.png

3.7 strstr函数

1.头文件<string.h>

2.基本格式:

9694c02461dd460aa16239a91811e407.png

返回指向 str1 中首次出现的 str2 的指针,如果 str2 不是 str1 的一部分,则返回空指针。

字符串的⽐较匹配不包含 \0 字符,以 \0 作为结束标志。
ce2118ebfbdf40a8b6b5c61c12c089d5.png
 
模拟实现:
 
e6da95e9421941aeb1ee1603b9a7017f.png    f9dc11a1597544beb54089249fdf4bbe.png
 
 

3.8 strtok函数

1.头文件:<string.h>

2.基本格式:

b4cdfbd11646470ea7f4ddd0d7f9e5a4.png

sep参数指向⼀个字符串,定义了⽤作分隔符的字符集合 ,通过sep字符串中的分隔符将str参数指向的包含了0个或者多个由sep字符串中⼀个或者多个分隔符的字符串进行分隔。
str参数指向了一个字符串,它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标记。
• strtok函数找到str中的下⼀个标记,并将其用'\0'结尾,返回⼀个指向这个标记的指针。(注:
strtok函数会改变被操作的字符串,所以在使⽤strtok函数切分的字符串⼀般都是临时拷⻉的内容
并且可修改。)
• strtok函数的第⼀个参数不为NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串 中的位置。
• strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标 记。
• 如果字符串中不存在更多的标记,则返回 NULL 指针。
 
9f49419ec0864b52a90fe290b25bd410.png
 
57a9c09007fa462a9ba3d7187bc63d2d.png
 
0d3f82f65f0c42dbbe35c91834570d85.png
 
模拟实现:
d7340e051f9c4960ae135ac0150e925b.png
 

3.9 strerror函数

1.头文件<string.h>

2.基本格式:

05454913639747f68f14f8d340b3577a.png

strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明的,C语⾔程序启动的时候就会使⽤⼀个全⾯的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会讲对应的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。
 
 
打印0-10错误码对应的错误信息:
 
716b31a651af4f95a5e2fbed0604007b.png

 

 

e62d358c97224c479ba4476035a9bd5b.png

perror 有能力直接打印错误信息,打印的时候,先打印传递给perror的字符串,然后打印:,再打印空格,最后打印错误信息。如果传递给perror的字符串为空字符串,直接打印错误信息。

头文件:<stdio.h>

基本格式:

16ecacfd0b874038bead09b47360776f.png

 

  • 12
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
sscanf函数C语言中一个非常常用的函数,它可以将一个字符串按照指定的格式转换成相应的数据类型。在嵌入式开发中,sscanf函数也是非常常见的,因为很多时候需要从串口或者其他外部设备中读取数据,并将其转换成相应的数据类型进行处理。下面是一些sscanf函数的使用技巧: 1. 使用sscanf函数时一定要注意格式字符串的正确性。格式字符串中的占位符必须与待转换的数据类型相对应,否则会发生未知错误。 2. 如果待转换的字符串中包含多个数据,可以使用多个占位符进行转换。例如,如果待转换的字符串为"1,2,3",可以使用" %d,%d,%d"的格式字符串进行转换。 3. 可以使用sscanf函数的返回值来判断转换是否成功。如果返回值等于待转换字符串的长度,则说明转换成功,否则转换失败。 4. 如果待转换的字符串中包含浮点数,可以使用"%f"或者"%lf"的格式字符串进行转换。 5. 如果待转换的字符串中包含十六进制数,可以使用"%x"的格式字符串进行转换。 6. 如果待转换的字符串中包含字符字符串,可以使用"%c"或者"%s"的格式字符串进行转换。 7. 如果待转换的字符串中包含指针类型的数据,可以使用"%p"的格式字符串进行转换。 总之,在使用sscanf函数时一定要注意格式字符串的正确性,否则很容易出现转换错误的情况。同时,还应该注意sscanf函数返回值的判断,以确保转换的正确性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值