strcpy的模拟实现的优化步骤

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了strcpy的模拟实现的优化步骤相关的知识,希望对你有一定的参考价值。

一、MSDN中对strcpy的注解

功能:strcpy用于字符串拷贝,将源字符串拷贝到目标字符串中; 参数:指向目标字符串的指针dest,指向源字符串的指针src; 返回值:返回指向目标字符串的指针; 标注:strcpy会将结束标志null(\\0)从源字符串中复制到目标字符串。

二、基本功能的实现

1、拷贝功能实现

首先实现基本功能,采用循环拷贝字符串,并以源字符串是否出现\\0作为循环结束标志;

#include<stdio.h>
void mystrcpy(char* dest, char* src)

	while (*src != \\0)
	
		//拷贝
		*dest = *src;
		//往后指向下一个位置
		dest++;
		src++;
	
	*dest = *src;//拷贝结束标志\\0

2、对代码书写进行优化

  • dest以及src的++可以采用后置++替换,可以实现原功能的同时简短代码;
  • 结束标志\\0的ASCII码值为0,可作为while循环结束判断的条件;
  • 赋值操作符=的返回值是左操作数。
void mystrcpy(char* dest, char* src)

	// 后置++实现指针往后推进,
	// 赋值操作=返回左操作值,达到while循环结束判断标志的同时,
	// 对结束标志\\0进行拷贝
	while (*dest++ = *src++);

3、使用const对源字符串进行保护,利用assert防止传参为野指针

  • const
    • 在*左边,表示修饰 *p,也就是指针指向的内容,此时不可更改指针p指向 的地址中的值,但指针可以指向别的位置;
    • 在*右边,表示修饰 p,只修饰指针,此时p只可指向当前所指向的地址, 而其中的值,可被更改。
  • assrt
    • ()中的条件不满足时,即为假时,执行代码时会报错,但在release版本中会被优化,仅在debug版本中存在。
void mystrcpy(char* dest, const char* src)

	assert(dest && src);//防止dest与src为空指针
	while (*dest++ = *src++);

4、返回值的满足

定义ret指针变量,用于保存目标字符串首地址; 注:不可直接返回dest,因为在对字符串拷贝的过程中,dest指向的地址已经发生变化,若返回dest,dest指向的将是目标字符串的末尾。

char* mystrcpy(char* dest, const char* src)

	assert(dest && src);//防止dest与src为空指针
	char* ret = dest;//保存源字符串首地址
	while (*dest++ = *src++);
	return ret;

三、优化

增加形参,用于标志目标字符串空间的长度,若源字符串长度大于目标空间长度,则报错。

char* mystrcpy(char* dest, const char* src, int dsz)

	int i = 0;//用于测算源字符串长度是否满足条件,包含\\0
	assert(dest && src);//防止dest与src为空指针
	char* ret = dest;//保存源字符串首地址
	while (*dest++ = *src++)
	
		i++;
		assert(i < dsz);
	
	return ret;

以上是关于strcpy的模拟实现的优化步骤的主要内容,如果未能解决你的问题,请参考以下文章

实现Strcpy函数 - 通过函数发现 “程序之美” | 不断优化优化再优化~

[C语言]模拟实现strcpy

模拟实现strcpy函数

模拟实现strncpy,strncat,strncmp

C语言初阶笔记程序员必须要会的实用调试技巧(含库函数strcpy和strlen的模拟实现)!!

C语言初阶笔记程序员必须要会的实用调试技巧(含库函数strcpy和strlen的模拟实现)!!