模拟实现strcpy函数——C语言

1.了解strcpy

功能:实现字符串的复制

结构:char*strcpy(char*destination,const char*source)

复制字符串,将源指向的字符串复制到目标指向的组中,包括终止的null字符eg:'\0'(并在该点停止)

2.strcpy函数的功能在代码里的体现

#include 
#include 

int main()
{
	char str1[] = "Sample string";
	char str2[40];
	char str3[40];
	printf("%s\n", str2);
	strcpy_s(str2, str1);
	strcpy_s(str3, "copy successful");
	printf("str1: %s\nstr2: %s\nstr3: %s\n", str1, str2, str3);
	return 0;
}

并且此时要注意:为了防止溢出,未确定大小的destination数组要确保足够大,能够完全接收源字符串的内容,且包括终止字符('\0')!

3.模拟实现strcpy函数的两种方式

(1)利用数组方式:

void my_strcpy(char* str1, char* str2)
{
	int i = 0;
	while (str2[i] != '\0')
	{
		str1[i] = str2[i];
		i++;
	}
	str1[i] = '\0';
}
int main()
{
	char str1[] = "xxxxxxxxxxxxxxxx";
	char str2[] = "hello";
	my_strcpy(str1, str2);
	printf("%s\n", str1);
}

(2)利用指针形式:

void my_strcpy(char* str1, char* str2)
{
	while (*str2 != '\0')
	{
		*str1 = *str2;
		str1++;
		str2++;
	}
	*str1 = *str2;
}
int main()
{
	char str1[] = "xxxxxxxxxxxxxxxx";
	char str2[] = "hello";
	my_strcpy(str1, str2);
	printf("%s\n", str1);
}

继续进行优化:优化1:

void my_strcpy(char* str1, char* str2)
{
	while(*str2!='\0')
	{
		*str1++ = *str2++;
	}
	*str1 = *str2;
}
int main()
{
	char str1[] = "xxxxxxxxxxxxxxxx";
	char str2[] = "hello";
	my_strcpy(str1, str2);
	printf("%s\n", str1);
}

优化2:

void my_strcpy(char* str1, char* str2)
{
	while (*str1++ = *str2++)
	{
		;
	}
}
int main()
{
	char str1[] = "xxxxxxxxxxxxxxxx";
	char str2[] = "hello";
	my_strcpy(str1, str2);
	printf("%s\n", str1);
}

此时while实现的条件是:*str1++=*str2++;该表达式的结果为:=左右两边的值,比如为:str2[0]=h

那么此时既将str2里面的内容赋给str1里面的内容,又可以利用while循环判断真假,在需要的位置将循环终止!代码进行了简化!

4.继续优化以上代码1

问题:1.由strcpy函数的结构可知strcpy函数有返回值,而在模拟实现strcpy函数的过程中,my_strcpy函数的返回值为void即无返回值,那么在此处需要进行优化;

解决问题1:因为strcpy函数的返回值为char*类型的,那么可以返回destionation的起始地址即可;并且由于此时模拟函数已有返回值,再int主函数内,就不需要再进行打印str1了,直接打印模拟函数my_strcpy的返回值即可(链式访问)

char*my_strcpy(char*str1,char*str2);

printf("%s\n",my_strcpy(str1,str2);
2.在strcpy函数内源指针用了const进行修饰,而在my_strcpy函数中,并没有使用const进行修饰,所以在此处也需要进行优化;

解决问题2:如下代码所示:

void my_strcpy(char* str1,  char* str2)
{
	while (*str2++ = *str1++)
	{
		;
	}
}
int main()
{
	char str1[] = "xxxxxxxxxxxxxxxx";
	char str2[] = "hello";
	my_strcpy(str1, str2);
	printf("%s\n", str1);
}

while()内的内容,在书写代码的过程中可能把str2与str1的位置进行颠倒;但是此时程序依然会继续运行,由于数组大小问题会报错,但是如图所示str1的内容仍然赋给了str2;模拟实现strcpy函数——C语言_第1张图片

那么为了防止以上内容的出现,我们就需要对str2内的内容进行保护,防止程序对其进行修改!

void my_strcpy(char*str1,const char*str2);

如上代码所示,加上const之后,str2里面的内容就不可以再被修改,那么如果再出现以上情景:

模拟实现strcpy函数——C语言_第2张图片

如图所示,程序此时就会自动报错,所以很容易发现该错误;

3.*destination可能是一个空指针,那么对空指针进行解引用,会出现问题,那么此时需要对于指针进行保护,此处也需要进行优化;

解决问题3:利用assert函数断言!

首先简单了解assert();当括号内的条件为真,那么则继续执行下面的程序;当括号内的条件为假时,报错,之后的程序也遍不能继续正常进行!

那么为了防止*destionation或者*source为空指针,那么再while循环开始之前就进行断言,即在while循环之前加上两个assert断言;

#include//assert()的头文件

assert(str1 !=NULL);
assert(str2 !=NULL);

那么经过以上优化,最终的代码就为:

#include
char* my_strcpy(char* str1,const char* str2)
{
	assert(str2 != NULL);
	assert(str1 != NULL);
	char* ret = str1;
	while (*str1++ = *str2++)
	{
		;
	}
	return ret;
}
int main()
{
	char str1[] = "xxxxxxxxxxxxxxxx";
	char str2[] = "hello";
	//my_strcpy(str1, str2);
	printf("%s\n", my_strcpy(str1,str2));
}

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