C语言实现strcpy函数和strlen函数

在操作字符串的函数大块中,其中有两个函数分别是strcpy和strlen函数,他们都是在#include<string.h>中包含。strcpy函数可以将一个字符数组的内容放到另一个字符数组中,实现字符串拷贝,而strlen函数是求一组字符串的长度的函数。他们都由C库提供,方便程序员使用。

今天我们将近距离还原这两个函数。


strcpy函数

首先我们先来了解一下strcpy函数的架构,他的返回值和参数。

 他的返回值类型是一个char*指针,第一个参数是一个将要粘贴的字符数组而第二个参数是被复制的字符数组,我们可以用一个自定义函数将其实现。

#include<stdio.h>
void my_strcpy(char* dest, char* scr)
{
	while (*scr != '\0')
	{
		*dest = *scr;
		scr++;
		dest++;
	}
	*dest = *scr;
}


int main(void)
{
	char arr1[] = "hello world!";
	char arr2[20];
	my_strcpy(arr2, arr1);
	printf("%s", arr2);

	return 0;
}

这是我们最先完成的代码,虽然可以将我们的目的达成,也是最简单的方式,但是却没有完全的与原strcpy吻合,返回值并不是char*,所以我们应该在完善一下。

#include<stdio.h>
char* my_strcpy(char* dest, char* scr)
{
	char* dp = dest;
	while (*dest = *scr)
	{
		scr++;
		dest++;
	}
	return dp;
}


int main(void)
{
	char arr1[] = "hello world!";
	char arr2[20];
	char* p = NULL; 
	printf("%s", my_strcpy(arr2, arr1));

	return 0;
}

我们现将自定义的函数的返回值改变,并且改变了while循环中的判断条件,使代码更加精炼,并且更像strcpy函数,但这远远不够,当我们传递一个空指针或错误指针时程序也应该做出判断,终止而且应该使用const修饰符在第二个参数中,使其不可被改变,减少bug产出。

我们引出assert函数 (断言函数),就是给出其判断条件,条件成立就继续执行程序,反之失败将终止程序运行,并将错误打印至屏幕。在使用assert函数时要包含#include<assert.h>头文件!!

#include<assert.h>
#include<stdio.h>
char* my_strcpy(char* dest,const char* scr)
{
	assert(dest != NULL);
	assert(scr != NULL);
	char* dp = dest;
	while (*dest = *scr)
	{
		scr++;
		dest++;
	}
	return dp;
}


int main(void)
{
	char arr1[] = "hello world!";
	char arr2[20];
	char* p = NULL;
	printf("%s", my_strcpy(arr2, arr1));

	return 0;
}

这样一个接近完美的strcpy函数就出来了。


strlen函数

strlen函数是获取字符串长度的,字符串的长度由终止空字符确定,当strlen函数遇到\0将停止。strlen函数返回值是一个size_t(无符号整数),参数为一个字符串的指针,加上const就是为了不改变传过来数组的内容。

#include<assert.h>
#include<stdio.h>
int my_strlen(const char* str)
{
	assert(str !=NULL)
	int count = 0;
	while (*str)
	{
		str++;
		count++;
	}
	return count;
}

int main(void)
{
	char arr[] = "hello world!";
	int num = my_strlen(arr);
	printf("%d\n", num);

	return 0;
}

我们依靠写strcpy的经验,很容易就写出了strlen函数了。

  • 15
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

W…Y

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

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

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

打赏作者

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

抵扣说明:

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

余额充值