模拟实现字符串有关函数(详细讲解)

在编写程序时,我们都喜欢写出简便并且效率高的代码,那么此时库函数中的有些函数就是我们的不二之选,那么,大家汇米你实现吗?下面就先从我们最简单的字符串函数说起:

1.strlen

这个是函数的格式,参数是const char* string,表示的是一个字符串的地址(就是在使用这个函数的时候,传参穿的是字符串的首地址),返回类型是无符号整数,那么,这个为什么是无符号整数呢?很简单,因为这个函数的功能是计算字符串长度,以字符'\0'结束,所以,再算长度的时候,总不能说是负数吧,所以返回类型是无符号整数。那么,介绍了这个函数的功能和形参还有返回类型,下面就是轮到我们模拟实现它了,请看下面代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include

void test1()
{
	char arr[] = "abcde";
	//首先使用库函数
	int len = strlen(arr);
	printf("%d", len);
}
int main()
{
	test1();
	return 0;
}

首先使用的是库里面的函数,打印结果如下:

模拟实现字符串有关函数(详细讲解)_第1张图片

其次使用我们自己实现的函数,代码以及打印结果如下:

#include
#include
#include
size_t my_strlen(const char* str)
{
	//先断言一下
	assert(str);
	//实现步骤
	int count = 0;
	while (*str++)
	{
		count++;
	}
	return count;
}
void test2()
{
	char arr[] = "abcde";
	//开始模拟实现
	int len = my_strlen(arr);
	printf("%d", len);
}
int main()
{
	test2();
	return 0;
}

 模拟实现字符串有关函数(详细讲解)_第2张图片

和库里函数一样,在实现strlen这个函数的时候,有三种实现方法,分别是递归,指针减指针,还有就是我的这个方法,大家下来可以试试用其他方法实现。

2.strcpy

这个函数的形参有两个,第一个形参是目的地,也就是你要拷贝的地方,第二个形参是源头,也就是你要拷贝的字符串。返回类型是char*,也就是char*的地址。这个函数的作用其实在刚刚我已经无意中说了,就是拷贝字符串。下面来看看库里的和我们自己所实现的到底一不一样:

库里函数的使用代码以及调试过程外加打印结果:

int main()
{
	char arr[] = "hello world";
	char arr1[20] = { 0 };
	strcpy(arr1, arr);
	printf("%s", arr1);
	return 0;
}

模拟实现字符串有关函数(详细讲解)_第3张图片

下面是我们自己所实现的代码以及调试过程和打印结果:

char* my_strcpy(char* dest, const char* src)
{
	//先断言
	assert(dest && src);
	//实现步骤
	char* tem = dest;
	while (*dest++ = *src++);
	return tem;
}
int main()
{
	char arr[] = "hello world";
	char arr1[20] = { 0 };
	char* p = my_strcpy(arr1, arr);
	printf("%s", p);
	return 0;
}

 

模拟实现字符串有关函数(详细讲解)_第4张图片

由此可见我们模拟实现的这个函数和库里功能相同。

注:1.在使用strcpy这个函数的时候,一定要谨记的一个错误,那就是第一个参数不能是常量字符串,因为常量字符串是不能修改的,而我们使用这个函数的要求就是目的地的空间大小可以修改。2.其实这一条注意事项和上一条差不多,那就是目的地的空间大小要足够容纳你所要拷贝的内容,否则会发生的错误是越界,也就是所谓的栈被破坏。 

3.strcat

这个函数的参数与上面的strcpy是一样的,返回类型也是一样的,都是char*,重复的话就不说了,可以看上面,直接在这说这个函数的功能是追加,就是在自己想要的字符串后面追加上想要追加的字符串,我们直接来看看库里的函数与模拟的代码以及调试过程和打印结果。

库里的函数:

int main()
{
	char arr[20] = "abcdef";
	char arr1[] = "ghijk";
	strcat(arr, arr1);
	printf("%s", arr);
	return 0;
}

 

模拟实现字符串有关函数(详细讲解)_第5张图片

下面来看看我们自己模拟实现的这个函数:

char* my_strcat(char* dest, const char* src)
{
	assert(dest && src);
	char* tem = dest;
	while (*dest++);
	//一定要减减
	dest--;
	while (*dest++ = *src++);
	return tem;
}
int main()
{
	char arr[20] = "abcde\0xxxxxxxx";
	char arr1[] = "hijk";
	char* p = my_strcat(arr, arr1);
	printf("%s", p);
	return 0;
}

模拟实现字符串有关函数(详细讲解)_第6张图片

这个是我们自己模拟实现的strcat,可以看到的是与库里的函数功能一模一样,下面说一下这个函数的注意事项:

1.首先,包含上面的strcpy的两个注意事项

2.这个函数不可以自己给自己追加

3.因为是字符串函数,所以是寻找字符串的\0这个字符,从\0开始,也是从\0结束

4.strcmp

这个函数两个参数是字符串的首地址,返回类型是int型的一个函数,那么,这个函数的功能是什么呢?我们在编写代码的时候少不了要比较大小,在比较数字的的大小直接用大于号与小于号就行,但是字符串是不可以直接用这个比较的,所以此时这个函数就可以派上用场了,没错,这个函数的功能就是比较字符串大小的。我们先来看看库里的函数:

int main()
{
	char arr[] = "abcdef";
	char arr1[] = "abc";
	int ret = strcmp(arr, arr1);
	printf("%d", ret);
	return 0;
}

 

 模拟实现字符串有关函数(详细讲解)_第7张图片

这个函数的返回值如果是字符串1大于字符串2的话,就返回大于0的数,等于返回0,小于返回小于0的数。

下面来看看我们自己模拟实现的这个函数:

int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1 && *str2)
	{
		if (*str1 == *str2)
		{
			str1++;
			str2++;
		}
		else
		{
			return *str1 - *str2;
		}
	}
	if (*str1 == '\0' && *str2 == '\0')
	{
		return 0;
	}
	else
	{
		return *str1 - *str2;
	}
}
int main()
{
	char arr[] = "abcefghijk";
	char arr1[] = "abce";
	int ret = my_strcmp(arr, arr1);
	printf("%d", ret);
	return 0;
}

 

模拟实现字符串有关函数(详细讲解)_第8张图片

为什么返回值不一样呢?因为这个库里的函数,根据编译器的不同返回值也是不同的,在cplusplus上面的显示的是这样的

模拟实现字符串有关函数(详细讲解)_第9张图片

也就是我上面所说返回的值是大于0,小于0,等于0,因为在我用的这个编译器环境下,大于0会返回1,小于0会返回-1,等于0就是返回0,所以在我们模拟实现这个函数的时候,我个人认为还是根据库里函数的规则来写,所以返回的值只要是大于0或是小于0的就可以,当然这个看自己的喜好,没有强制要求。

以上函数是字符串长度不受限制的字符串函数,后面会更新字符串长度受限制的字符串函数的详细讲解,好了,如果本章内容对你有所帮助的话就留下一个赞吧,支持一下。谢谢! 

你可能感兴趣的:(c语法篇,c++,c语言,算法)