strcpy strncpy memcpy等系列库函数剖析与实现

# include<iostream>
# include<cassert>
using namespace std;
/*
首先说明一下库中strcpy的功能;其函数库原型为char* strcpy(char* dst,char const *src)
函数功能:将原字符串的内容复制到目标字符串,dst是一个数组指针或者是一个一块动态分配内存的数组的指针
注意事项:
1.源字符串比目标字符数组长的话,多余的字符将会目标空间之后的地方,可能会不经意间使目标空间之后某些存放
重要数据的空间被修改。这将是一个很严重的问题,strcpy无法解决这个问题,因为它无法知道目标字符数组的长
度。所以编程的时候尤其要注意检查目标空间是否足够。
2.源字符串比目标字符数组短的时。由于新字符串一'\0'结尾,在这之前的字符为有效字符。当然这块空间可能是原先
有字符被修改也可能是重新赋值。但不管怎样只有‘\0’前的字符有效。
*/

//实现strcpy
char *my_strcpy(char *dest, char const *src)
{
    assert((dest != NULL) && (src!= NULL));
	char*d_temp = dest;
	char *s_temp = (char*)src;
	while ((*(d_temp++) = *(s_temp++))!= '\0')
	{
		;
	}	
	return dest;
}
/*
char *strncpy(char*dst,charc const *src,size_t len)
函数功能:复制源字符串中len个字符到目标数组
注意;有安全问题
如果strlen(src)小于len就在dst的后面填充NUL直到len。这就存在效率问题。
如果strlen(src)大于len,就复制len个字符到dst,这样dst的结果就不会以NUL结尾。
因此说strncpy调用结果可能不是一个字符串。
*/
//自己实现strncpy
char *my_strncpy(char *dst, char const *src, size_t len)
{
	assert((dst != NULL) && (src != NULL));
	char *d_temp = dst;
	char *s_temp = (char *)src;
	int i = 0;
	while ((*d_temp = *s_temp) && (i++ < len))
	{
		dst++;
		src++;
	}
	*(dst + len) = '\0';//对库函数做改进
	return dst;
}


/*
strcat函数的原型是 char* strcat(char *dst,char const *src)
函数功能:将源字符串的一份拷贝连接到dst字符串的后面
注意事项;dst所表示的字符串必须存在,可以是空字符串。但是如果dst和src所表示的空间发生重叠其结果是未定义的
*/
//下面自己实现一个strcat函数
char *my_strcat(char*dest, char const *src)
{
	char *d_temp = dest;
	char *s_temp = (char *)src;
	while (*d_temp!=NULL)
	{
		d_temp++;
	}
	while (*d_temp = *s_temp)//这种写法很巧妙执行结束后d_temp的末尾已经加上了NUL('\0')
	{
		d_temp++;
		s_temp++;
	}
	return dest;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值