strlen/strcpy的实现(不使用库函数)

strlen功能的实现

strlen的功能:计算一串字符的长度
设计思想:返回类型为整型int,参数为一个字符型指针变量char*
int my_strlen(char* src)
用字符指针接收字符首字母的地址,当指针指向’\0’时,计数器count停止++;

代码如下

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

int my_strlen(const char *src)
{
	assert(src!=NULL);	//断言
	int count = 0;
	while (*src++)
	{
		count++;
	}
	return count;
}

int main()
{
	const char *p = "abcdef";
	printf("%d\n",my_strlen(p));
	return 0;
}

assert的作用:防止传输的指针为NULL,引起错误,方便调试;且在发行版本中可以优化掉。
使用时需要引头文件<assert.h>
const的作用:保护指针的指向的内容不会发生变化。

运行结果:在这里插入图片描述

strcpy功能的实现

strcpy的功能:字符串复制;
设计思想:字符串复制不需要返回类型,先选择void作为返回类型。参数可知,需要两个字符指针char接收
void my_strcpy(char
dest, char* src)
将接收字符串首地址的指针向后移动就可以得到字符串中的各个字符,目标地址的指针与字符串指针同步移动被赋值就完成了字符串复制的功能。

代码如下

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

void my_strcpy(char* dest,const char* src)
{
	assert(dest != NULL);	//断言
	assert(src != NULL);
	while (*src)
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;
}

int main()
{
	const char* p = "abcdef";
	char arr[10];
	my_strcpy(arr,p);
	printf("%s\n",arr);
	return 0;
}

优化:
分析程序时发现,while循环中的循环体既可以作为while循环的判断条件,也可以完成赋值,同时还可以对两个指针就行自增;
优化如下:

void my_strcpy(char* dest,const char* src)
{
	assert(dest != NULL);	//断言
	assert(src != NULL);
	while (*dest++ = *src++)
	{
		;
	}
}

通过查阅资料发现:strcpy的返回类型不为void,为char* 返回了字符串的首地址,所以要在指针开始移动之前保存初始的指向地址,用char* ret = src保存,返回ret;
:ret的作用为作为其他函数调用时的参数
优化代码如下:

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

char* my_strcpy(char* dest,const char* src)
{
	char* ret = *src;
	assert(dest != NULL);	//断言
	assert(src != NULL);
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

int main()
{
	const char* p = "abcdef";
	char arr[10];
	my_strcpy(arr,p);
	printf("%s\n",arr);
	return 0;
}

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Thinker_serious/article/details/83311065