字符串函数

目录

一、strlen函数

(1)、strlen如何使用?

(2)、strlen的三种模拟实现(递归、指针、计数器)

 2、strlen的模拟实现(指针)

二、strcpy函数

(1)、strcpy如何使用?

(2)、strcpy的两种模拟实现(指针、递归)

三、strncpy函数

 (1)、strncpy函数的使用

(2)、strncpy的模拟实现

四、strcat函数 

(1)、strcat函数的使用

(2)、strcat函数的模拟实现(指针)

1、strcat的模拟实现(指针)

五、strncat函数

六、strcmp函数

(1)、strcmp的使用方法。

(2)、strcmp的模拟实现(指针)

1、strcmp的模拟实现(指针)

七、strncmp函数

(1)、strncmp函数的使用

(2)、strncmp的模拟实现

八、strstr函数

(1)、什么是strstr?(strstr = string + string)

(2)、strstr的模拟实现

九、strtok函数

(1)、什么是strtok?

(2)、strtok的模拟实现

十、memmove函数(待完善)

(1)、什么是memmove函数

(2)、memmove的模拟实现

十一、memset函数(待完善)

(1)、memset函数的使用

(2)、memset的模拟实现

十二、memcpy函数(待完善)

(1)、memcpy函数的使用

(2)、memcpy的模拟实现


一、strlen函数

顾名思义:计算字符串长度 ( strlen = string + lenth )

(1)、strlen如何使用?

注意:

1、strlen遇到‘\0’才停止 ,计算结果不包括‘\0’

2、返回值是size_t(无符号整型)

    //定义一个字符串
    char arr[5] = "abcd";
    //调用strlen函数
    int size = strlen(arr);    //直接计算该字符串长度
    //打印
	printf("%d ", size);

解释:strlen直接计算字符串长度

           1、定义一个字符串

           2、调用strlen函数,返回值用int接收

           3、打印看结果

(2)、strlen的三种模拟实现(递归、指针、计数器)

 1、strlen模拟实现(递归)

先看代码:

#include<stdio.h>
#include<string.h>

int Mystrlen(char* arr)
{
	//利用迭代实现strlen
	if (*arr++)    //解引用,不是'\0'就++
	{
		return 1 + Mystrlen3(arr);    //通过不断调用自身
	}
	else
	{
		return 0;
	}
}

int main()
{
	char arr[5] = "abcd";    //定义一个字符串
	int ret = Mystrlen(arr);    //调用函数
	printf("%d ", ret);
	return 0;
}

递归:通过不断调用自身,再跟if函数打配合实现最终效果

先看两个

完整版如图:

 Tip:递归的精髓在于回溯,很容易绕晕

 2、strlen的模拟实现(指针)

同样先看代码

#include<stdio.h>
#include<string.h>

int Mystrlen2(const char* arr)    //arr接收
{
	char* temp = arr;    //设置一个temp记录arr的首地址
	while (1)
	{
		if (*arr++)    //遍历到‘\0’
		{
			;
		}
		else
		{
			return arr - temp - 1;    //利用,长度=指针-指针
		}
	}
	
}

int main()
{
	char arr[5] = "abcd";//定义一个字符串
	ret = Mystrlen2(arr);//调用函数
	printf("%d ", ret);
	return 0;
}

简短的解析 

Tip:

        1、不设置计数器

        2、还记得嘛,指针-指针=字符串长度,那么我们需要拿到最后一个字符。

        3、那么不使用strlen如何拿到最后一个字符?

                答:既然string字符串后面必有\0,为何不试试while遍历数组再和if打配合呢,

 3、strlen的模拟实现(计数器)

看代码

#include<stdio.h>
#include<string.h>

int Mystrlen(const char* arr)//arr接收
{
	//设置计数器
	int count = 0;
	while (*arr++)//解引用arr不为'\0'则++
	{
		count++;
	}
	return count;
}

int main()
{
	char arr[5] = "abcd";    //定义一个字符串
	int ret = Mystrlen(arr);    //调用函数
	printf("%d ", ret);
	return 0;
}

二、strcpy函数

顾名思义:字符串拷贝( strcpy = string + copy )

注意:

        1、strcpy遇到'\0'才停止

(1)、strcpy如何使用?

1、定义两个字符串

2、调用strcpy函数

3、打印

#include<stdio.h>
#include<string.h>

int main()
{
	char src[10] = "abcd";	//定义源头字符串
	char dest[11] = "*****";	//定义目的地字符串
	char* ret = strcpy(dest, src);	//调用strcpy函数

	//打印
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%c ", ret[i]);
	}
	return 0;
}

(2)、strcpy的两种模拟实现(指针、递归)

1、strcpy的模拟实现(指针)

#include<stdio.h>
#include<string.h>

char* Mystrcpy1(char* dest, char* src)
{

	char* temp = dest;	//设置一个变量存放初始dest的地址

	while (*dest++ = *src++)	//逐个字符拷贝
	{
		;
	}
	return temp;
}

int main()
{
	char src[10] = "abcd";	//定义源头字符串
	char dest[11] = "*****";	//定义目的地字符串
	strcpy(dest, src);	//调用strcpy函数

	
	char* ret = Mystrcpy1(dest, src);	//调用函数

	//打印
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%c ", ret[i]);
	}
	return 0;
}

2、strcpy的模拟实现(递归)

#include<stdio.h>
#include<string.h>

char* Mystrcpy2(char* dest,const char* src)
{
	const char* temp = dest;	//设置一个指针存放dest的初始地址
	if (*src)	//直到*src==0退出循环
	{
		*dest++ = *src++;	//将src中的元素放到dest中
		Mystrcpy2(dest, src);	//重复调用Mystrcpy2函数
	}
	else
	{
		*dest = '\0';	//在dest末尾放一个'\0'	
	}
	
	return temp;	//回归
}

int main()
{
	char src[10] = "abcd";	//定义源头字符串
	char dest[11] = "*****";	//定义目的地字符串

	char* ret = Mystrcpy2(dest, src);		//调用函数

	//打印
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%c ", ret[i]);
	}
	return 0;
}

注意:

        1、末尾必须有‘\0’,不然后面会残留dest的字符,或者会有系统生成的随机值。

三、strncpy函数

 (1)、strncpy函数的使用

strncpy是字符串拷贝。n是限制拷贝的个数。

#include <stdio.h>
#include<string.h>

int main()
{
	//strncpy
	char str1[10] = "abcdef";
	char str2[10] = "**";	//确保目标数组空间足够

	char* ret = strncpy(str2, str1, 3);

	puts(ret);
	return 0;
}

(2)、strncpy的模拟实现

#include <stdio.h>
#include<string.h>

char* Mystrncpy(char* str1, char* str2,size_t num)
{
	char* temp = str2;
	while (num--)
		*str2++ = *str1++;
	*str2 = '\0';
	return temp;
}

int main()
{
	//strncpy
	char str1[10] = "abcdef";
	char str2[10] = "**";	//确保目标数组空间足够

	//待拷贝的字符个数
	int num = 3;
	char* ret = Mystrncpy(str2, str1, num);

	puts(ret);
	return 0;
}

四、strcat函数 

(strcat = string + concatenate)

strcat是追加字符串,在一个字符串后面加上另一个字符串。

(1)、strcat函数的使用

#include<stdio.h>
#include<string.h>

int main()
{
	char src[10] = "abcd";	//设置源头字符串
	char dest[5] = "***";	//设置目标字符串

	char* ret = strcat(src, dest);

	//打印
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%c ", ret[i]);
	}

	return 0;
}

(2)、strcat函数的模拟实现(指针)

1、strcat的模拟实现(指针)

#include<stdio.h>
#include<string.h>

char* Mystrcat1(char* src, char* dest)
{
	char* temp = src;    //设置字符串保存src的初始地址
	while (*src)    //遍历整个src字符串
		src++;
	while (*dest)    //只要碰到dest后面的‘\0’退出
		*src++ = *dest++;    //把dest放在src后面
	return temp;    //返回src的初始地址
}


int main()
{
	char src[10] = "abcd";	//设置源头字符串
	char dest[5] = "123";	//设置目标字符串

	char* ret = Mystrcat1(src, dest);	//指针实现

	//打印
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%c ", ret[i]);
	}

	return 0;
}

五、strncat函数

(1)、strncat的使用方法

#include<stdio.h>
#include<string.h>

int main()
{
	//strncat
	char str1[10] = "abc\0def";
	char str2[10] = "**";

	//char* ret = strncat(str1, str2, 3);		//追加之后末尾自动补零

	puts(ret);
	return 0;
}

(2)、strncat的模拟实现

#include<stdio.h>
#include<string.h>

char* Mystrncat(char* str1, char* str2, size_t num)
{
	char* temp = str1;
	//遍历整个str1
	while (*str1)
		str1++;
	while (num--)
		*str1++ = *str2++;
	*str1 = '\0';
	return temp;
}

int main()
{
	//strncat
	char str1[10] = "abc\0def";
	char str2[10] = "**";

	//模拟实现
	char* ret = Mystrncat(str1, str2, 3);
	puts(ret);
	return 0;
}

六、strcmp函数

(1)、strcmp的使用方法。

注意:

        1、strcmp比较适用于长度相同的字符串

        2、依旧是遇到‘\0’就停止

#include<stdio.h>
#include<string.h>


int main()
{
    //定义两个字符串
	char p1[10] = "abcdef";
	char p2[10] = "abcd";

	int ret = strcmp(p1, p2);	//调用函数
	printf("%d", ret);	//打印

	//打印
	printf("%d ", ret);
	return 0;
}

(2)、strcmp的模拟实现(指针)

1、strcmp的模拟实现(指针)

#include<stdio.h>
#include<string.h>


//指针
int Mystrcmp1(const char* p1, const char* p2)
{
	char* s1 = (char*)p1;	//把p1存放到临时指针s1中(p1类型为const char*,故强制类型转化)
	char* s2 = (char*)p2;
	char* cur = (char*)p1;
	while(*s1)
	{
		s1 = cur;
		s2 = (char*)p2;
		while (*s1 && *s2 && *s1 == *s2)	//s1和s2都不为'\0',进入循环
			s1++;	
			s2++;
		if (!*s2)	//s2为0,直接return
			return 0;
		cur++;
	}
	if (*s1 > *s2)	//s2不为0,判断字符串谁大谁小
		return 1;
	else
		return -1;
}



int main()
{
	//strcmp比较适用与长度相同的字符串
	char p1[10] = "abcdef";
	char p2[10] = "abcd";

    //调用函数
	int ret = Mystrcmp1(p1, p2);	


	//打印
	printf("%d ", ret);
	return 0;
}

七、strncmp函数

(1)、strncmp函数的使用

#include<stdio.h>
#include<string.h>

int main()
{
	//strncmp
	char str1[10] = "abcdef";
	char str2[10] = "abbdeg";

	int ret = strncmp(str1, str2, 3);

	//打印
	printf("%d ", ret);
	return 0;
}

(2)、strncmp的模拟实现

#include<stdio.h>
#include<string.h>

int Mystrncmp(char* str1, char* str2, size_t num)
{
	while (num--)
	{
		if (*str1++ != *str2++)
			return str1-str2;
	}
	return 0;
}
int main()
{
	//strncmp
	char str1[10] = "abcdef";
	char str2[10] = "abbdeg";

	//模拟实现
	int num = 3;
	int ret = Mystrncmp(str1, str2, num);

	//打印
	printf("%d ", ret);
	return 0;
}

八、strstr函数

(1)、什么是strstr?(strstr = string + string)

strstr是字符串查找函数。

例如:

        char s1 = “abcd”;

        char s2 = “b”;

        strstr(s1,s2);//s2在s1中是否出现,是返回字符串首地址,不是返回-1。

(2)、strstr的模拟实现

#include<stdio.h>
#include<string.h>

//strstr

char* Mystrstr(char* str1, char* str2)
{
	//在str1中查找这个字符串
	char* p1 = str1;
	char* p2 = str2;
	char* cur = str1;

	//循环str1,让cur一个一个往后走
	while (*cur)
	{
		p1 = cur;
		p2 = str2;

		while (*p1 == *p2)
			p1++,p2++;
		if (!*p2)
			return cur;
		cur++;
	}
	return 0;
}
int main()
{
	//使用
	//定义两个字符串
	char* str1 = "abbcdef";
	char* str2 = "bbc";

	//strstr的模拟实现
	char* ret = Mystrstr(str1, str2);

	//打印
	if (!ret)	//判断ret的返回值是否是空指针
		printf("找不到");
	else 
		puts(ret);
	return 0;
}

九、strtok函数

(1)、什么是strtok?

字符串分割

例如:

        char str = "i/am/a/student."

想把句子隔开,通过strtok函数。

‘/’用作为隔开条件。

#include<stdio.h>
#include<string.h>

int main()
{
	//使用
	//定义两个字符串
	char* str1 = "abbcdef";
	char* str2 = "bbc";

	char* ret = strstr(str1, str2);

	//打印
	if (!ret)	//判断ret的返回值是否是空指针
		printf("找不到");
	else 
		puts(ret);
	return 0;
}

(2)、strtok的模拟实现

#include<stdio.h>
#include<string.h>

//strstr

char* Mystrstr(char* str1, char* str2)
{
	//在str1中查找这个字符串
	char* p1 = str1;
	char* p2 = str2;
	char* cur = str1;

	//循环str1,让cur一个一个往后走
	while (*cur)
	{
		p1 = cur;
		p2 = str2;

		while (*p1 == *p2)
			p1++,p2++;
		if (!*p2)
			return cur;
		cur++;
	}
	return 0;
}

char* Mystrstr2(char* p1, char* p2)
{
	
}

int main()
{
	//使用
	//定义两个字符串
	char* str1 = "abbcdef";
	char* str2 = "bbc";

	char* ret = strstr(str1, str2);

	//strstr的模拟实现
	ret = Mystrstr(str1, str2);

	//打印
	if (!ret)	//判断ret的返回值是否是空指针
		printf("找不到");
	else 
		puts(ret);
	return 0;
}

十、memmove函数(待完善)

(1)、什么是memmove函数

(2)、memmove的模拟实现

十一、memset函数(待完善)

(1)、memset函数的使用

(2)、memset的模拟实现

十二、memcpy函数(待完善)

(1)、memcpy函数的使用

(2)、memcpy的模拟实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值