目录
- 0.前言
- 1.gets
- 2.strlen
- 3.strcpy
- 4.strncpy
- 5.strcat - (效率低)
- 6.strncat
- 7.strcmp
- 8.strncmp
- 9.strstr
- 10.strtok
- 11.strerror
- 12.perror(相对于strerror可能更好用)
- 13.ctype.h
- 14.memcpy
- 15.memmove
- 16.memcmp
- 17.memset
- 18.atoi
0.前言
- 本篇主要介绍处理字符和字符串的库函数的使用及其注意事项
- 求字符串长度
- strlen
- 长度不受限制的字符串函数
- strcpy
- strcat
- strcmp
- 长度受限制的字符串函数介绍
- strncpy
- strncat
- strncmp
- 字符串查找
- strstr
- strtok
- 错误信息报告
- strerror
- 字符操作
- 内存操作函数
- memcpy
- memmove
- memset
- memcmp
- 求字符串长度
- C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中
- 字符串常量适用于那些对它不做修改的字符串函数
- 相邻字符串(“”)具有自动连接特性
- 字符串在结尾的位置隐藏了一个
\0
的字符 \0
是字符串的结束标志
1.gets
- 函数原型:
char* gets(char* str)
- 从标准输入
stdin
读取一行,并把它存储在str
所指向的字符串中- 当读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定
- 相较
scanf
的好处:遇到“ ”
也可继续往后读写,直到遇到换行符
2.strlen
- 函数原型:
size_t strlen(const char* str)
- 字符串以
'\0'
作为结束标志,strlen()返回的是在字符串中'\0'
前面出现的字符个数(不包含'\0'
) - 参数指向的字符串必须要以
'\0'
结束 - 注意:函数的返回值类型为
size_t
,是无符号的
3.strcpy
- 函数原型:
char* strcpy(char* dest, const char* src)
- 功能:将源字符指向的C字符串复制到目标指向的数组中,会将源字符串中的
'\0'
拷贝到目标空间 - 源字符串必须以
'\0'
结束 - 目标空间必须足够大,以确保能存放源字符串
- 目标空间必须可变
4.strncpy
- 函数原型:
char* strncpy(char* dest, const char* src, size_t num)
- 功能:将源字符串的前
num
个字符从源字符串到目标空间- 如果源字符串的长度小于
num
,则拷贝完源字符串之后,在目标的后边追加0,直到num
个
- 如果源字符串的长度小于
5.strcat - (效率低)
- 函数原型:
char* strcat(char* dest, const char* src
- 功能:把
src
所指向的字符串追加到dest
所指向的字符串的结尾 - 源字符串必须以 '\0’结束
- 目标空间必须有足够的大,能容纳下源字符串的内容
- 目标空间必须可修改
6.strncat
- 函数原型:`char* strncat(char* dest, const char* src, size_t num)
- 功能:把
src
所指向的字符串追加到dest
所指向的字符串的结尾,直到num
字符长度为止- 如果源字符串的长度小于
num
,则仅复制终止字符'\0'
之前的内容
- 如果源字符串的长度小于
- 返回值:该函数返回一个指向最终的目标字符串
dest
的指针
7.strcmp
- 函数原型:
int strcmp(const char* str1, const char* str2)
- 功能:比较两个字符串,
strcmp()
开始比较每个字符串的第一个字符,如果它们彼此相等,则继续执行向后对比,直到字符不同或达到终止字符'\0'
- 返回值:
< 0 -> str1 < str2
0 -> str1 == str2
> 0 -> str1 > str2
8.strncmp
- 函数原型:
int strncmp(const char* str1, const char* str2, size_t num)
- 功能:类似
strcmp()
,比较到出现第一个字符不一样或者一个字符串结束或者num
个字符全部比较完
9.strstr
- 函数原型:
char* strstr(const char* str1, const char* str2)
- 功能:在字符串
str1
中查找第一次出现字符串str2
的位置,不包含终止符'\0'
- 返回值:返回在
str1
中第一次出现str2
字符串的位置,如果未找到则返回NULL
10.strtok
- 函数原型:
char* strtok(char* str, const char* sep)
- 参数:
sep
包含分隔符的C字符串,可以是一个分隔符集合- 例如:
" ,.-"
- 例如:
str
要被分解成一组小字符串的字符串
- 功能:
strtok()
找到str
中的下一个子串,并将其用'\0'
结尾,返回一个指向这个子串的指针strtok()
的第一个参数不为NULL
,函数将找到str
中第一个子串,strtok()
将它保存常量字符串区(静态区)strtok()
的第一个参数为NULL
,函数将在同一个字符串中被保存的位置开始,查找下一个子串- 即:
strtok()
维护的缓冲区有"记忆功能",倘若连续分割同一个字符串,则除了第一次调用外,后续调用第一个参数传NULL
即可
- 即:
- 如果字符串中不存在更多的子串,则返回
NULL
- 注意:
strtok()
会改变被操作的字符串,所以在使用strtok()
切分的字符串一般都是临时拷贝的内容并且可修改
11.strerror
- 函数原型:
char* strerror(int errnum)
- 功能:返回错误码,所对应的错误信息
- 使用库函数的时候,调用库函数失败的时候,都会设置错误码(全局的错误码)
- 头文件:
errno.h
12.perror(相对于strerror可能更好用)
- 函数原型:`void perror(const char* str)
- 功能:把一个描述性错误消息输出到标准错误
stderr
- 首先输出字符串
str
,后跟一个冒号,然后是一个空格
- 首先输出字符串
perror()
相对于strerror()
可能更好用
13.ctype.h
- 该头文件下的接口用于测试和映射字符
- 如果参数
c
满足描述的条件,则这些函数返回非零(true),如果参数c
不满足描述的条件,则这些函数返回零(false)
函数 | 如果它的参数符合下列条件就返回真 |
---|---|
iscntrl | 任何控制字符 |
isspace | 空白字符:空格' ' ,换页'f' ,换行\n ,回车\r ,制表符\t 或者垂直制表符\v |
isdigit | 十进制数字(0~9) |
isxdigit | 十六进制数字,包括所有十进制数字(0~9) ,字母(a~f A~F) |
islower | 小写字母a~z |
isupper | 大写字母A~Z |
isalpha | 字母(a~z A~Z) |
isalnum | 字母(a~z A~Z) 或者 数字(0~9) |
ispunct | 标点符号,任何不属于数组或者字母的圆形字符(可打印) |
isgraph | 任何图形字符 |
isprint | 任何可打印字符,包括图形字符和空白字符 |
tolower | 把大写字母转换为小写字母 |
toupper | 把小写字母转化为大写字母 |
14.memcpy
- 函数原型:
void* memcpy(void* dest, const void* src, size_t num)
- 功能:
memcpy()
从src
的位置开始向后复制num
个字节的数据到dest
的内存位置memcpy()
在遇到'\0'
的时候并不会停下来- 毕竟是内存操作函数,不是字符串操作函数
- 注意:如果
src
和dest
有任何的重叠,复制的结果都是未定义的 - 返回值:返回一个指向目标存储区
dest
的指针
15.memmove
- 函数原型:
void* memmove(void* dest, const void* src, size_t num)
- 功能:类似
memcpy()
,和memcpy()
的差别是memmove()
处理的源内存块和目标内存块是可以重叠的 - 如果源空间和目标空间出现重叠,就得使用memmove函数处理
16.memcmp
- 函数原型:
int memcmp(const void* ptr1, const void* ptr2, size_t num)
- 功能:和
strcmp()
类似,但是是以字节为单位进行比较的
17.memset
函数原型:void* memset(void* str, int c, size_t n)
功能:以字节为单位设置内存
18.atoi
- 函数原型:
int atoi(const char* str)
- 功能:把参数
str
所指向的字符串转换为一个整数(类型为int
) - 参数:
str
– 要转换为整数的字符串 - 返回值:返回转换后的整数,如果没有执行有效的转换,则返回零
- 依赖库:
<stdlib.h>