<<C>>深度理解字符串函数<string.h> 模拟实现

目录

1. (string length)

1.1功能

1.2模拟实现strlen

2.strcpy(string copy)

2.1功能:复制字符串

2.2模拟实现

3.strcat

3.1功能

3.2模拟实现

4.strcmp

3.1功能

3.2模拟实现

5.strstr

5.1功能:

5.2模拟实现


1. (string length)

1.1功能

计算字符串的长度

size_t strlen ( const char * str );

注意:不计算  ' \0 '                         例如:

char arr[]="nihenNB"
//我们知道这种初始字符串,编译器会在后面自动添加'\0'
//长度为7+1=8
printf("%d",strlen(arr));
//打印的结果为7,不计算'\0'

1.2模拟实现strlen

(一共有三种方法),可以对比一下

int my_strlen(char* arr)//计数器的方式
{
	int n = 0;
	while (*arr != '\0')
	{
		n++;
		arr++;
	}
	return n;
}
int my_strlen2(char* arr)//不创建临时变量的计数器方法
{
	//试用嵌套	
	if (*arr == '\0')
	{
		return 0;
	}
	else
	{
		return 1 + my_strlen2(arr + 1);
	}
}
int my_strlen3(char* arr)//使用指针的方法
{
	char* p = arr;
	while (*p++ != '\0')
	{
		;
	}
	return p - arr - 1;
}
int main()//模拟实现strlen
{
	char arr[] = "i am shan haonan.";
	printf("%d\n", my_strlen3(arr));
	return 0;
}

2.strcpy(string copy)

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

2.1功能:复制字符串

返回目的指针,可以实现链式访问(复制的地方,复制的内容)

注意:

源字符串必须以 '\0' 结束。
会将源字符串中的 '\0' 拷贝到目标空间。
目标空间必须足够大,以确保能存放源字符串。
目标空间必须可变。
学会模拟实现。

2.2模拟实现

#include<stdio.h>
#include<string.h>
char* my_strcpy(char* arr2,char *arr1)//返回的值为arr2
{
	//while (*arr1!='\0')
	//{
	//	*arr2 = *arr1;
	//	arr2++;
	//	arr1++;
	//}
	//上述代码可以简化内下:
	char* arr = arr2;
	while (*arr2++ = *arr1++)
	{
		;
	}
	return arr;
}
int main()//模拟实现strcpy
{
	char arr1[] = "hello";
	char arr2[20] = "0";
	//strcpy(arr2, arr1);//将arr1的内容拷贝到arr2中
	my_strcpy(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

3.strcat

char * strcat ( char * destination, const char * source );

3.1功能

在目标空间的后面添加新的内容 

源字符串必须以 '\0' 结束。
目标空间必须有足够的大,能容纳下源字符串的内容。
目标空间必须可修改。
字符串自己给自己追加,如何?

3.2模拟实现

#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcat(char* des, char* res)
{
	assert(des != NULL);
	assert(res != NULL);
	char* p = des;
	while (*des!= '\0')
	{
		des++;
	}
	//while (*res!='\0')//字符串复制
	//{
	//	*des = *res;
	//	des++;
	//	res++;
	//}
	//上述代码简化版本:
	while (*des++ = *res++)
	{
		;//当赋值/0的时候,括号内相当于0为假,自然就结束了循环
		//但是要注意结束循环的时候 des和res又一次++
	}
	return p;
}
int main()//模拟实现strcat
{
	char arr[20] = "helllo";
	char arr2[] = " sb";
	//printf("%s\n",strcat(arr, arr2));
	printf("%s\n",my_strcat(arr, arr2));
	return 0;
}

4.strcmp

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

3.1功能

第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字

3.2模拟实现

#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_strcmp(char* arr1, char* arr2)
{
	assert(arr1 && arr2);
	while (*arr1 == *arr2)
	{
		arr1++; 
		arr2++;
	}
	return (*arr1 - *arr2);
}
int main()//模拟实现strcmp
{
	char arr1[] = "hello";
	char arr2[] = "hallo";
	//如果arr1>arr2返回>0
	//printf("%d", strcmp(arr1, arr2));
	printf("%d", my_strcmp(arr1, arr2));
	return 0;
}

5.strstr

char * strstr ( const char *str1, const char * str2);

5.1功能:

判断是否str2是str1的字串,如果是,则该函数返回str2在str1中首次出现的地址;

否则,返回NULL。

5.2模拟实现

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


char* my_strstr(char* des, char* res)
{
	assert(des && res);
	char* flag = des;
	while (*flag!='\0')
	{
		char* s1 = flag;
		char* s2 = res;
		while (*s1 == *s2)
		{
			s1++;
			s2++;
			if (*s2 == '\0')
			{
				return flag;
			}
		}
		flag++;
	}
	return NULL;
}
int main()//模拟实现strstr,查找是否存在子字符串
{
	char arr[] = "abcdedef";
	char arr2[] = "def";


	//printf("%s\n",strstr(arr, arr2));//返回的是arr的内部字串的地址
	my_strstr(arr, arr2);
	printf("%s\n", my_strstr(arr, arr2));
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shn!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值