C语言—字符函数和字符串函数解析及其模拟实现

时间:2022-01-26 01:03:49


目录

一、求字符串的长度

1、strlen()-字符串长度

二、长度不受限制的字符串函数

1、strcpy()-字符串拷贝

2、strcat()-字符串追加

3、strcmp()-字符串比较

三、长度受限制的字符串函数

1、strncpy()-字符串拷贝n个字符

2、strncat()-字符串追加n个字符

3、strncmp()-比较字符串的 前n个字符

四、字符串查找

1、strstr()-查找字符串

2、strtok()-字符串分割

五、错误信息报告

1、strerror()-错误码对应的错误信息

六、字符函数

1、字符分类函数

2、字符转换函数

重点介绍处理字符和字符串的库函数的使用和注意事项以及模拟实现

一、求字符串的长度

1、strlen()-字符串长度

格式:

size_t strlen(const char* str);

实例:

C语言—字符函数和字符串函数解析及其模拟实现

要点:

1、字符串包含“\0”,但strlen()函数所求的长度是“/0”之前的个数

2、参数指向的字符串必须要以“\0”结束

3、注意函数的返回值是size_t(unsigned int),是无符号的(易错)

C语言—字符函数和字符串函数解析及其模拟实现

模拟实现:

int my_strlen(const char* arr) {
	int count = 0;
	assert(arr != NULL);
	while (*arr != '\0') {
		count++;
		arr++;
	}
	return count;
}

二、长度不受限制的字符串函数

1、strcpy()-字符串拷贝

格式:

char* strcpy(char* destination,const char* source)

实例:

C语言—字符函数和字符串函数解析及其模拟实现

要点:

1、源字符串必须以“\0”结束

2、会将原字符串中的“\0”拷贝到目标空间

3、目标空间必须足够大,以确保能存放源字符串

4、目标空间必须可变

2、strcat()-字符串追加

格式:

char* strcat(char* dastination,const char* source)

实例:

C语言—字符函数和字符串函数解析及其模拟实现

要点:

1、源字符串必须以“\0”结束

2、目标空间必须足够大,能容纳下源字符串的内容

3、目标空间必须可修改

字符串自己给自己追加,如何?

不可,无限循环,系统崩溃!!!

原因:追加时,dest字符串的“\0”被覆盖,src没有结束标志。

C语言—字符函数和字符串函数解析及其模拟实现

模拟实现:

char* my_strcat(char* dest, const char* src) {
	
	char* ret = dest;
	assert(dest && src);
	//1、找到目标字符串
	while(* dest){
		dest++;
	}
	//2、追加源字符串
	//a、执行*dest = *src,拷贝字符
	//b、对dest,src,执行++操作,拷贝下一个字符
	//c、当*dest = *src时,退出while循环
	while(*dest++ = *src++){
		
	}
	return ret;
}

3、strcmp()-字符串比较

格式:

int strcmp(const char* str1,const char* str2)

实例:

C语言—字符函数和字符串函数解析及其模拟实现

标准规定:

1、第一个字符串>第二个字符串,则返回>0 的数字

2、第一个字符串=第二个字符串,则返回0

3、第一个字符串<第二个字符串,则返回<0 的数字

模拟实现:

int my_strcmp(const char* str1,const char* str2) {
	while (*str1 == *str2) {
		if (*str1 == '\0') {
			return 0;
		}
		str1++;
		str2++;
	}
	return *str1 - *str2;
	}
}

三、长度受限制的字符串函数

1、strncpy()-字符串拷贝n个字符

格式:

char* strncpy(char* destination,const char* source,size_t num)

实例:

C语言—字符函数和字符串函数解析及其模拟实现

要点:

1、从源字符串拷贝n个字符到目标字符串

2、如果源字符串的长度小于num,则拷贝完源字符串后,在目标后面追加“\0”,直到num个

2、strncat()-字符串追加n个字符

格式:

char* strncat(char* destination,const char* source,size_int num)

实例:

C语言—字符函数和字符串函数解析及其模拟实现

要点:

1、从源字符串追加n个字符到目标字符串

2、如果源字符串的长度小于num,则拷贝完源字符串后便结束,不再继续追加

3、strncmp()-比较字符串的 前n个字符

格式:

char* strncat(char* destination,const char* source,size_int num)

实例:

C语言—字符函数和字符串函数解析及其模拟实现

要点:

1、比较源字符串和目标字符串的前 n个字符

2、比较到出现另一个字符不一样或者一个字符串结束或者num个字符全部比较完成的时候结束

与第二点所提函数相比,本组三个函数的安全性相对较高,不易出bug

四、字符串查找

1、strstr()-查找字符串

格式:

char* strctr(const char*, const char*;

实例:

C语言—字符函数和字符串函数解析及其模拟实现

要点:

1、用于在一个字符串1中,查找字符串2是否出现

2、如果有出现字符串1中查找到字符串2,返回第一个匹配字符的地址,否则,返回NUll

模拟实现:

char* my_strstr(const char* str1,const char* str2){

	assert(str1 && str2);
	const char* s1 = NULL;
	const char* s2 = NULL;
	const char* cp = str1;

	if (*str2 == "\0") {
		return (char*)str1;
	}
	while (*cp) {
		s1 = cp;
		s2 = str2;
		
		while (*s1 && *s2 && (*s2 == *s1)) {
			s1++;
			s2++;
		}
		if (*s2 == '\0') {
			return (char*)cp;
		}
		cp++;

	}
	return NULL;
}

易混淆点:

        const 离变量名近就是用来修饰指针变量的,离变量名远就是用来修饰指针指向的数据,如果近的和远的都有,那么就同时修饰指针变量以及它指向的数据

2、strtok()-字符串分割

格式:

char* strtok (char* str, const char* sep)

实例:

C语言—字符函数和字符串函数解析及其模拟实现

要点:

1、sep参数是一个字符串,定义用作分隔符的字符集合

2、第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中的一个或者多个分隔符分割的标记

3、strtok函数找到str中的下一个标记,并将其用“\0”结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可以修改)

4、strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存让他在字符串中的位置

5、strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记

6、如果字符串中不存在更多的标记,则返回NULL指针

五、错误信息报告

1、strerror()-错误码对应的错误信息

格式:

char* strerr (int errnum);

实例:

C语言—字符函数和字符串函数解析及其模拟实现

要点:

1、返回错误码对应的错误信息

2、使用库函数到时候,调用库函数失败时,都会设置错误码errno(int类型)

六、字符函数

1、字符分类函数

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

1、iscntrl                1、任何控制字符
2、isspance           2、空白字符:空格,换行,换页,回车等
3、isdigit                3、十进制数字0-9
4、isxdigit              4、十六进制数字,包括所有十进制数字,小写字母a-f,大写字母A-F
5、islower              5、小写字母a-z
6、isupper             6、大写字母A-Z
7、isalpha              7、字母a-z或A-Z
8、isalnum             8、字母或者数字a-z,A-Z,0-9
9、ispunct              9、标点符号
10、isgraph           10、任何图形字符
11、isprint              11、任何可打印字符,包括图像字符,空白字符

2、字符转换函数

int tolower( int c);-转小写

int toupper( int c);-转大写

实例:

C语言—字符函数和字符串函数解析及其模拟实现

~