库函数的模拟实现

目录

一、字符分类函数

1、常见函数

2、函数使用举例

3、使用练习

二、字符转换函数

1、两个字符转换函数的形式

2、大小写转换练习

三、strlen函数

1、strlen的形式和规则

(1)  strlen的形式

(2)  使用规则

2、strlen的使用

3、strlen的模拟实现

四、strcpy函数

1、strcpy的形式和规则

(1) strcpy的形式    

(2) 使用规则(拷贝字符串)

2、strcpy的使用

3、strcpy的模拟实现

五、strcat函数

1、strcat的形式和规则

(1) strcat的形式

(2) strcat的规则

2、strcat的使用

3、strcat的模拟实现

六、strcmp函数

1、strcmp的形式和规则

(1)strcmp的形式

(2)strcmp的规则 (比较字符串的大小)

2、strcmp的使用

3、srtcmp的模拟实现

七、strncpy函数

1、strncpy的形式

2、strncpy的规则

3、strncpy的使用

八、strncat函数

1、strncat的形式

2、strncat的规则

3、strncat的使用

九、strncmp函数

1、strncmp的形式

2、strncmp的规则

3、strncmp的使用

十、strstr函数

1、strstr的形式

2、strstr的规则

3、strstr的使用

4、strstr的模拟实现

十一、strtok函数

1、strtok的形式

2、strtok的规则

3、strtok的使用

十二、strerror函数

1、strerror的形式

2、strerror的规则


一、字符分类函数

专门用做字符分类的一系列函数(一个字符是属于什么类型的字符的)

【使用时,包含头文件ctype.h

1、常见函数

2、函数使用举例

islower函数:判断参数 c 部分是否为小写

#include<stdio.h>
#include<ctype.h>
int main()
{
	int ret = islower('A');
	printf("%d\n", ret);      //0

	int a = islower('a');
	printf("%d\n", a);        //2

	int b = islower('0');
	printf("%d\n", b);        //0
	return 0;
}

3、使用练习

将字符串中的小写转大写,其他字符不变。

#include<stdio.h>
#include<ctype.h>
int main()
{
	char arr[] = "I am a student!";
	int i = 0;
	while (arr[i] != '\0')
	{
		if (islower(arr[i]))
		{
			arr[i] = arr[i] - 32;
		}
		i++;
	}
	printf("%s\n", arr);     //I AM A STUDENT!
	return 0;
}

二、字符转换函数

1、两个字符转换函数的形式

#include<stdio.h>
#include<ctype.h>
int main()
{
	char ch1 = toupper('a');
	printf("%c\n", ch1);   //A

	char ch2 = tolower('A');
	printf("%c\n", ch2);   //a
	return 0;
}

2、大小写转换练习

将字符串中的小写字母转换为大写字母。

#include<stdio.h>
#include<ctype.h>
int main()
{
	char arr[] = "I am a student!";
	int i = 0;
	while (arr[i] != '\0')
	{
		if (islower(arr[i]))
		{
			arr[i] = toupper(arr[i]);
		}
		i++;
	}
	printf("%s\n", arr);     //I AM A STUDENT!
	return 0;
}

三、strlen函数

1、strlen的形式和规则

(1)  strlen的形式

(2)  使用规则
字符串以 '\0' 作为结束标志,strlen函数返回的是 在字符串中 '\0' 前面出现的字符个数
                                                                                                                         (不包含 '\0' )。
参数指向的字符串必须要以 '\0' 结束。
注意函数的返回值为 size_t,是无符号的。
strlen的使用需要包含头文件。【   #include <string.h>   】

2、strlen的使用

#include<stdio.h>
#include<string.h>
int main()
{
	if ((int)strlen("abc") - (int)strlen("abcdef") > 0)
	{
		printf(">\n");
	}
	else
	{
		printf("<=\n");    //<=
	}
	return 0;
}

3、strlen的模拟实现

#include<stdio.h>
#include<string.h>
#include<assert.h>
size_t my_strlen(const char* str)
{
	int count = 0;
	assert(str != NULL);
	while (*str != 0)
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	char arr[] = "abcdef";
	size_t len = my_strlen(arr);
	printf("%zd\n",len);     //6
	return 0;
}

四、strcpy函数

1、strcpy的形式和规则

(1) strcpy的形式    

(2) 使用规则(拷贝字符串)
源字符串必须以 '\0' 结束。
会将源字符串中的 '\0' 拷贝到目标空间。
目标空间必须足够大,以确保能存放源字符串。
目标空间必须可修改。
strcpy的使用需要包含头文件。【   #include <string.h>   】

2、strcpy的使用

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "hello world!";
	char arr2[20] = { 0 };
	strcpy(arr2, arr1);
	printf("%s\n", arr2);   //hello world!
	return 0;
}

3、strcpy的模拟实现

#include<stdio.h>
#include<string.h>
#include<assert.h>
void my_strcpy(char* dest, const char* src)
{
	assert(dest != NULL);
	assert(src != NULL);
	char* ret = dest;
	while (*src != '\0')
	{
		*dest = *src;
		src++;
		dest++;
	}
	*dest = *src;
	return ret;
}
int main()
{
	char arr1[] = "helloo";
	char arr2[20] = { 0 };

	my_strcpy(arr2, arr1);
	printf("%s\n", arr2);   //helloo
	return 0;
}

五、strcat函数

1、strcat的形式和规则

(1) strcat的形式

(2) strcat的规则

 找到目标空间的末尾\0, 再将源字符串拷贝过来。字符串的追加

源字符串必须以 '\0' 结束。
目标字符串中也得有 \0 ,否则没办法知道追加从哪里开始。
目标空间必须有足够的大,能容纳下源字符串的内容。
目标空间必须可修改。
strcat的使用需要包含头文件。【   #include <string.h>   】

2、strcat的使用

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "baby!";
	strcat(arr1, arr2);
	printf("%s\n", arr1);   //hello baby!
	return 0;
}

3、strcat的模拟实现

#include<stdio.h>
#include<string.h>
#include<assert.h>
//返回目标空间的起始地址
char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
//找目标空间的\0
	while (*dest != '\0')
		dest++;
//拷贝
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "baby!";
	
	my_strcat(arr1, arr2);   //字符串追加
	printf("%s\n", arr1);   //hello baby!
	return 0;
}

六、strcmp函数

1、strcmp的形式和规则

(1)strcmp的形式

(2)strcmp的规则 (比较字符串的大小)
•  第⼀个字符串 大于 第⼆个字符串,则返回大于0的数字
•  第⼀个字符串 等于 第⼆个字符串,则返回 0
•  第⼀个字符串 小于 第⼆个字符串,则返回小于0的数字
•  比较两个字符串中对应位置上字符ASCII码值的大小
• 比较的不是字符串的大小,而是 对应位置上的字符大小
strcmp的使用需要包含头文件。【   #include <string.h>   】

2、strcmp的使用

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abq";
	int ret = strcmp(arr1, arr2);
	printf("%d\n", ret);    //-1
	return 0;
}

3、srtcmp的模拟实现

#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 != NULL);
	assert(str2 != NULL);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
		{
			return 0;
		}
		str1++;
		str2++;
	}
	return (*str1 - *str2);
}
int main()
{
	char arr1[] = "abcedf";
	char arr2[] = "abq";
	int ret = my_strcmp(arr1, arr2);
	printf("%d\n", ret);    //-14
	return 0;
}

七、strncpy函数

1、strncpy的形式

【strnpy函数:限制拷贝的长度,想拷贝几个就几个】

2、strncpy的规则

拷贝num个字符从源字符串到目标空间。
如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。

strncpy的使用需要包含头文件。【   #include <string.h>   】

3、strncpy的使用

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[20] = "abcdef";
	char arr2[20] = { 0 };
	strncpy(arr2, arr1, 3);
	printf("%s\n", arr2);    //abc
	return 0;
	
}

八、strncat函数

1、strncat的形式

【strncat:限制追加的字符个数

2、strncat的规则

将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0
符。
如果source 指向的字符串的⻓度⼩于num的时候,只会将字符串中到 \0 的内容追加到destination指向的字符串末尾。
strncat的使用需要包含头文件。【   #include <string.h>   】

3、strncat的使用

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[20] = "hello ";
	char arr2[20] = "sweetbaby";
	strncat(arr1, arr2, 5);
	printf("%s\n", arr1);    //hello sweet

	return 0;
}

九、strncmp函数

1、strncmp的形式

【strncmp:限制比较字符的个数】

2、strncmp的规则

strncmp的使用需要包含头文件。【   #include <string.h>   】

3、strncmp的使用

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[20] = "abcdef ";
	char arr2[20] = "abcq";
	int ret = strncmp(arr1, arr2, 4);
	printf("%d\n", ret);    //-1

	return 0;
}

十、strstr函数

1、strstr的形式

【strstr:在一个字符串中找另一个字符串有没有出现过

2、strstr的规则

函数返回字符串str2在字符串str1中第⼀次出现的位置。

字符串的比较匹配不包含 \0 字符,以 \0 作为结束标志。

strstr的使用需要包含头文件。【   #include <string.h>   】

【在 str1中找str2是否出现过, 若出现过一次以上,我们返回的是第一次出现的位置;
    若没有找到,返回一个空指针】

3、strstr的使用

#include<stdio.h>
#include<string.h>
int main()
{
	char arr[] = "abcdefabcdef";
	char* p = "efab";
	char* ret = strstr(arr, p);
	if (ret == NULL)
	{
		printf("不存在\n");    
	}
	else
	{
		printf("%s\n", ret);  //efabcdef
	}
	return 0;
}
4、strstr的模拟实现
#include<stdio.h>
#include<string.h>
#include<assert.h>
const char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 != NULL);
	assert(str2 != NULL);
	const char* s1 = NULL;
	const char* s2 = NULL;
	const char* cur = str1;

	if (*str2 == '\0')//特殊情况
	{  //这个时候说明三体人指向的是个空字符串
		return str1;
	}
	while (*cur != '\0')
	{
		s1 = cur;
		s2 = str2;
		while ((*s1 != '\0') && (*s2 != '\0') && (*s1 == *s2))
		{//当他们不相等时,跳出这个循环
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return cur;
		}
		cur++;
	}
	return NULL;
}
int main()
{
	char arr[] = "abcdefabcdef";
	char* p = "cdef";
	char* ret = my_strstr(arr, p);
	if (ret == NULL)
	{
		printf("不存在\n");
	}
	else
	{
		printf("%s\n", ret);  //cdefabcdef
	}
	return 0;
}

十一、strtok函数

1、strtok的形式

2、strtok的规则

sep参数指向⼀个字符串,定义了⽤作分隔符的字符集合
第⼀个参数指定⼀个字符串,它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标
记。
strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向这个标记的指针。
(注: strtok函数会改变被操作的字符串,所以被strtok函数切分的字符串⼀般都是临时拷贝的内                容并且可修改。)
strtok函数的第⼀个参数不为 NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串
中的位置。
strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标
记。
如果字符串中不存在更多的标记,则返回 NULL 指针。
strtok的使用需要包含头文件。【   #include <string.h>   】

3、strtok的使用


#include<stdio.h>
#include<string.h>
int main()
{
	char arr[] = "[email protected]@hehe.ahah#ttt";
	char buf[256] = { 0 };
	strcpy(buf, arr);
	char* sep = "@.#";
	char* ret = NULL;
	for (ret = strtok(buf, sep); ret != NULL; ret = strtok(NULL, sep))
	{
		printf("%s\n", ret);     //apengwei
		                         //yeah
			                     //net
			                     //hehe
			                     //ahah
			                     //ttt
	}
	return 0;
}

十二、strerror函数

1、strerror的形式

2、strerror的规则

  strerror 函数可以把参数部分错误码对应的错误信息的字符串地址返回来

•  str的使用需要包含头文件。【   #include <string.h>     #include<errno.h>     】

感谢观看,欢迎指正