admin管理员组

文章数量:1487745

字符串函数(2)strcpy函数的模拟与优化

strcpy函数的解释与注意事项

  • Copies the C string pointed by source into the array pointed by destination, including the terminating null character (and stopping at that point).
  • 源字符必须以‘\0’结束。
  • 会将源字符串中的‘\0’拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可变。

strcpy函数的使用

头文件<string.h>

代码语言:javascript代码运行次数:0运行复制
#include <stdio.h>
#include <string.h>
int main()
{
	char ch1[20] = "abc";
		char ch2[] = "abcdef";
		printf("%s\n", strcpy(ch1, ch2));

	return 0;
}

strcpy函数的模拟实现

代码语言:javascript代码运行次数:0运行复制
#include <stdio.h>
char*  my_strcpy(char* str1, char* str2)
{
	char* ret = str1;
	while (*str2 != '\0')
	{
		*str1 = *str2;
		str1++;
		str2++;
	}
	return ret;
}
int main()
{
	char ch1[20] = "abc";//目的字符串必须足够大以确保可以放下源字符串
	char ch2[] = "abcdef";
	
	printf("%s\n", my_strcpy(ch1, ch2) );
	return 0;
}

尽管这段代码可以完成任务,但是如果满分10分的情况下这个段代码只有5分。 下面我们来对这段代码进行优化吧。

优化其一

为了防止传过来空指针,我们就要运用断言(assert) 有了assert就可以有效避免空指针的出现。

代码语言:javascript代码运行次数:0运行复制
#include <stdio.h>
#include <assert.h>
char*  my_strcpy(char* str1, char* str2)
{
	assert(str1 && str2);//有效避免空指针的危害
	char* ret = str1;
	while (*str2 != '\0')
	{
		*str1 = *str2;
		str1++;
		str2++;
	}
	return ret;
}
int main()
{
	char ch1[20] = "abc";//目的字符串必须足够大以确保可以放下源字符串
	char ch2[] = "abcdef";
	
	printf("%s\n", my_strcpy(ch1, ch2) );
	return 0;
}

优化其二

在my_strcpy中我们用的是char* my_strcpy(char* str1, char* str2)接收其实我们可以添加const在char的前方,目的是为了防止源字符串被修改。用代码表示就是:

代码语言:javascript代码运行次数:0运行复制
#include <stdio.h>
#include <assert.h>
char*  my_strcpy(char* str1, const char* str2)//防止源字符串被改变
{
	assert(str1 && str2);//有效避免空指针的危害
	char* ret = str1;
	while (*str2 != '\0')
	{
		*str1 = *str2;
		str1++;
		str2++;
	}
	return ret;
}
int main()
{
	char ch1[20] = "abc";//目的字符串必须足够大以确保可以放下源字符串
	char ch2[] = "abcdef";
	
	printf("%s\n", my_strcpy(ch1, ch2) );
	return 0;
}

优化其三

大家知道后置++的运算规则吗。——先使用后加1,利用这个性质,我们就可以做到再一次的优化。下面看代码吧。

代码语言:javascript代码运行次数:0运行复制
#include <stdio.h>
#include <assert.h>
char*  my_strcpy(char* str1, const char* str2)//防止源字符串被改变
{
	assert(str1 && str2);//有效避免空指针的危害
	char* ret = str1;
	while (*str1++=*str2++)//充分利用后置++的性质,做到代码的优化。
	{
		;
	}
	return ret;
}
int main()
{
	char ch1[20] = "abc";//目的字符串必须足够大以确保可以放下源字符串
	char ch2[] = "abcdef";
	
	printf("%s\n", my_strcpy(ch1, ch2) );
	return 0;
}

充分利用后置++,可以让代码得到意想不到的优化。 那么本次教学就到此为止了,我是结衣,期待你的关注,我们共同进步。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2024-10-15,如有侵权请联系 cloudcommunity@tencent 删除char函数优化指针字符串

本文标签: 字符串函数(2)strcpy函数的模拟与优化