# 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;
}
strcpy strncpy memcpy等系列库函数剖析与实现
最新推荐文章于 2023-07-16 00:29:12 发布