1.字符分类函数
字符分类函数是用于字符分类的,判断给定字符属于什么类型,这写分类函数都放头文件ctype.h,如果函数属于这个类型函数就返回为真。
字符分类函数的分类:
2.字符转换函数
字符转换函数 | 函数作用 |
tolower | Convert uppercase letter to lowercase. 将大写字母转换为小写字母。 |
toupper | Convert lowercase letter to uppercase. 将小写字母转换为大写字母。 |
头文件为ctype.h
函数返回值:如果存在,就转换;不存在,就等于自己。
例子:
#include<stdio.h> #include<ctype.h> int main() { printf("%c\n", tolower('A'));//大写转小写 printf("%c\n", toupper('a'));//小写转大写 return 0; }
结果:
注意:上面所有的字符函数的函数定义都满足以下形式:
int Fuc_name(int c);
都是将字符转换为ASCII码值进行判断,最后返回ASCII值,再隐式转换为字符
3.字符串函数
常用的字符串函数有:拷贝、比较、追加和查找,还有一些特殊的,如strlen求长度等等。
所有作用字符串的函数都放在string.h这个头文件,下面图表示string.h中所有的函数:
而我们只重点介绍下面几个函数:
函数 | 作用 |
strcpy | 拷贝字符串 |
strcat | 追加字符串 |
strcmp | 比较字符串 |
strncpy | 拷贝n个字 |
strncat | 追加n个字符 |
strncmp | 比较n个字符 |
strstr | 查找字符串 |
strtok | 拆分字符串 |
strerror | 获取错误信息 |
strstr函数、strtok函数和strerror函数下章详细介绍
(1).拷贝字符串函数
A.strcpy函数
函数定义:
char * strcpy ( char * destination, const char * source );
作用:
将源头空间的字符串拷贝到目标空间的字符串里,是全拷贝,拷贝会把源头空间'\0'也拷贝进去。
参数:
- char * destination目标字符串所在空间的起始地址,需要修改的字符串所以没用const修饰。
- const char * source源头字符串所在空间的起始地址,不需要被修改所以用const修饰,以防写错代码。
返回值:
char*类型,接受目标空间的起始地址。
例子:
![]()
拷贝会将斜杆0也一起拷贝
模拟实现:
char* my_strcpy(char* p1, const char* p2) { char* ret = p1; //p1在函数中会被使用,最后不会指向目标空间的起始位置,需要用中间指针保存目标空间地址 //原理:一个一个字符的替换,直到将源头字符的\0拷贝完就截至 while (*p1++ = *p2++)//如果没检测到\0就继续拷贝 { ; } return ret;//返回目标空间的起始地址 }
测试:
![]()
成功实现
B.strncpy函数
函数定义:
char * strncpy ( char * destination, const char * source, size_t num );
作用:
将源头空间的num个字符拷贝到目标空间的字符串里。
如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个,追加完后再补上'\0'。
参数:
- char * destination目标字符串所在空间的起始地址,需要修改的字符串所以没用const修饰。
- const char * source源头字符串所在空间的起始地址,不需要被修改所以用const修饰,以防写错代码。
- size_t num需要从源头字符串拷贝的字符数目
返回值:
char*类型,接受目标空间的起始地址。
例子:
![]()
模拟实现:
char* my_strncpy(char* p1, const char* p2, size_t num) { //如果num==0,就不需要拷贝,返回目标空间的地址 if (num == 0) return p1; char* tmp = p1; //p1在函数中会被使用,最后不会指向目标空间的起始位置,需要用中间指针保存目标空间地址 //拷贝num个字符,循环就进行num次 while (num--) { if (*p2 != '\0') *p1++ = *p2++; //如果num大于源头字符串的长度,就将超过的补上0 else *p1++ = 0; } *p1 = '\0';//赋值完再给目标字符加上'\0' return tmp;//返回目标空间的初始地址 }
测试:
![]()
8个超出了4个,就补4个0,补完后再加'\0'
(2).追加字符串函数
A.strcat函数
函数定义:
char * strcat ( char * destination, const char * source );
作用:
将源头空间的字符串追加到目标空间的字符串里,就是从目标空间的字符串的'\0'起开始追加源头空间的字符串,那么目标空间就必须要有'\0'才能追加。
参数:
- char * destination目标字符串所在空间的起始地址,需要修改的字符串所以没用const修饰。
- const char * source源头字符串所在空间的起始地址,不需要被修改所以用const修饰,以防写错代码。
返回值:
char*类型,接受目标空间的起始地址。
例子:
注意:
通常这种未规定长度的数组在初始化的就会开辟固定死的空间大小,如果该数组后续需要添加元素的话可能会出现栈溢出的情况,所以对于后续需要添加元素的数组最好是在创建的时候就规定好大小。
模拟实现:
char* my_strcat(char* p1, const char* p2) { //先用中间指针接收目标空间的起始地址,以免后面使用导致找不到目标空间地址、 char* tmp = p1; //1.从目标字符串的'\0',开始追加,就要先找到'\0' while (*p1 != '\0') { p1++; } //2.找到后开始追加,直到追加到源头空间的'\0'为止 while (*p2 != '\0') { *p1++ = *p2++;//追加 } *p1=*p2;//将'\0'追加过去 return tmp; }
测试:
![]()
测试成功
B.strncat函数
函数定义:
char * strncat ( char * destination, const char * source, size_t num );
作用:
将源头空间的num个字符追加到目标空间的字符串里,就是从目标空间的字符串的'\0'起开始追加num个源头空间的字符。
如果num的值大于源头字符串的长度,就只需要将'\0'前的字符串追加就行了,最后再补个'\0'。
参数:
- char * destination目标字符串所在空间的起始地址,需要修改的字符串所以没用const修饰。
- const char * source源头字符串所在空间的起始地址,不需要被修改所以用const修饰,以防写错代码。
- size_t num需要从源头字符串追加的字符数目。
返回值:
char*类型,接受目标空间的起始地址。
例子:
模拟实现:
char* my_strncat(char* p1, const char* p2,size_t num) { //先用中间指针接收目标空间的起始地址,以免后面使用导致找不到目标空间地址 char* tmp = p1; //1.从目标字符串的'\0',开始追加,就要先找到'\0' while (*p1 != '\0') { p1++; } //2.找到后开始追加,追加num次即可,如果*p2=='\0'时就停止追加 while (num--) { if (*p2 == '\0') { *p1 = *p2;//将'\0'追加过去 break; } *p1++ = *p2++;//追加 } return tmp; }
测试:
(3).比较字符串函数
A.strcmp函数
函数定义:
int strcmp ( const char * str1, const char * str2 );
作用:
将两个字符串中对应的字符一一比较
参数:
两个都是用于比较的,不会被修改的,所以用const修饰,以免出现书写错误。
返回值:
int类型,如果比较为真就返回大于0的数,如果比较为假就返回小于0的数,如果相等就返回0。
例子:
注意:VS对于strcmp函数的返回值设定时为真返回1,为假返回-1,相等返回0。
模拟实现:
int my_strcmp(const char* str1, const char* str2) { //一直判断,相等就往下走,若'\0'就结束 while (*str1++ == *str2++) { ; } //不相等就做差 return (int)(*str1 - *str2); }
测试:
B.strncmp函数
函数定义:
int strncmp ( const char * str1, const char * str2, size_t num );
作用:
将两个字符串中对应的num个字符进行比较
参数,返回值同上。
例子:
模拟实现:
int my_strncmp(const char* str1, const char* str2, size_t num) { //比较num次或者不相等就没必要比了 while (num>0&& *str1== *str2) { str1++; str2++; num--; } //如果此时num=0说明比完了 if (num == 0) return 0; else//如果不等于说明还的比下一个 return (int)(*str1 - *str2); }
测试:
本章内容结束,下章见,拜拜!!!