【C】库函数之strcpy

Copy string

  Copies the C string pointed by source into the array pointed by destination, including the terminating null character (and stopping at that point).

  To avoid overflows, the size of the array pointed by destination shall be long enough to contain the same C string as source (including the terminating null character), and should not overlap in memory with source.

   上述内容是C++官网对strcpy函数的介绍,可以看出strcpy函数用于复制字符串,它将source指向的C字符串复制到目标所指向的数组中,包括终止空字符('\0'),当遇到'\0'时,复制结束。在复制的过程中,需要注意的是目标指向的数组大小应该足够长,这样才能包含与源字符串相同大小的字符串,并且目标字符串不能是"abc"这样的常量字符串,因为这样的字符串不能写,只能读,最重要的一点,目标字符串不能与源字符串重叠。

   接下来通过介绍几种实现strcpy函数的方法来说明下如何写出高质量代码:

/*
*	函数名称:MyStrcpy
*
*	函数功能:复制源字符串的内容
*
*	入口参数:dest, src
*
*	出口参数:dest
*
*	返回类型:void
*/

void MyStrcpy(char * dest, char * src)
{
	while ('\0' != (*src))
	{
		*dest = *src;
		src++;
		dest++;
	}

	//循环跳出来时*src=='\0',将'\0'赋给*dest
	*dest = *src;

	return;
}

   不足:while循环内部的语句过于繁琐。

   改进:优化while循环内部的语句为一句。

void MyStrcpy(char * dest, char * src)
{
	while ('\0' != (*src))
	{
		//后置++优先级高于*,而后置++是先赋值再加1,
		//因此先赋值的是src原来的字符(*src),一次赋值结束后
		//src+1, dest+1
		*dest++ = *src++;
	}

	//循环跳出来时*src=='\0',将'\0'赋给*dest
	*dest = *src;

	return;
}

   不足:*src要分成两种情况('\0' != *src 和 '\0' == *src)去讨论。

   改进:优化while循环内部的语句作为循环条件。

void MyStrcpy(char * dest, char * src)
{
	while (*dest++ = *src++)
	{
		;
	}

	return;
}

   不足:没有判断指针的有效性。

   改进:检查指针的有效性。

void MyStrcpy(char * dest, char * src)
{
	if ((NULL != dest) && (NULL != src))
	{
		return;
	}
	else
	{
		while (*dest++ = *src++)
		{
			;
		}
	}
}

   不足:上述代码每次都需要判断指针是否为空。

   改进:添加assert断言优化。

void MyStrcpy(char * dest, char * src)
{
	assert((NULL != dest) && (NULL != src));

	while (*dest++ = *src++)
	{
		;
	}

	return;
}

   不足:假如把dest与src的顺序写反了,程序只会在运行中报错。

   改进:保证src这个源字符串内容不可修改(添加const),这样当写反dest和src时,会在编译时报错。

void MyStrcpy(char * dest, const char * src)
{
	assert((NULL != dest) && (NULL != src));

	while (*dest++ = *src++)
	{
		;
	}

	return;
}

   不足:上述代码不能作为参数传入函数内部。

   改进:修改函数返回类型为char *,以实现链式访问。

/*
*	函数名称:MyStrcpy
*
*	函数功能:复制源字符串的内容
*
*	入口参数:dest, src
*
*	出口参数:dest
*
*	返回类型:char *
*/

char * MyStrcpy(char * dest, const char * src)
{
	char * cp = dest;

	assert((NULL != src) && (NULL != cp));
		
	while (*cp++ = *src++)
	{
		;
	}

	return dest;
}

   如何写出高质量代码?

1.使用assert;

2.尽量使用const;

3.良好的编码风格;

4.必要的注释。

主函数

#define _CRT_SECURE_NO_WARNINGS 1

/*
* Copyright (c) 2018, code farmer from sust
* All rights reserved.
*
* 文件名称:MyStrcpy.c
* 功能:实现库函数strcpy
*       char * strcpy ( char * destination, const char * source )
*
* 当前版本:V1.0
* 作者:sustzc
* 完成日期:2018年4月20日11:37:28
*/

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

int main(void)
{
	char str1[10] = "abc";
	char *str2 = "123";

	printf("str1: %s\n", str1);
	printf("str2: %s\n", str2);
	printf("copy after,str1: %s\n", MyStrcpy(str1, str2));

	return 0;
}

输出结果


猜你喜欢

转载自blog.csdn.net/sustzc/article/details/80014714
今日推荐