关于几个常见函数
strcpy,strncpy,memcpy,memmove;
那么现在开始一个一个实现吧!
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#define MAX 20
/*关于指针传参时的断言和const修饰的习惯有必要养成
比较常用的就是strcpy了;
需要注意的是dest必须有足够的空间可以拷贝src中的字符串;*/
char* my_strcpy(char *dest,const char *src)
{
char *ret = dest;
assert(src);
assert(dest);
while(*dest++ = *src++)
{
;
}
return ret;
}
/*关于strcpy的缺陷大家应该有所了解,就是strcpy不会对越界进行检查;
在strncpy中我会把这个缺陷弥补;
num为终止的参数;*/
>strncpy:
char* my_strncpy(char* dest,const char *src,int num)
{
char *ret = dest;
int i = 0;
assert(src);
assert(dest);
//通过i的增长关系与num的比较限制拷贝字符的个数;
//并且在while语句中对越界拷贝进行了限制;
while(i++ < num && (*dest++ = *src++)!='\0')
{
;
}
if(*src!='\0')//当不完全拷贝时赋予dest字符串结束的标志;
*dest = '\0';
return dest;
}
strcpy 和 strncpy的区别仅仅是拷贝限制参数的区别
/*关于memcpy和memmove要详细说明一下:
1.memcpy是把src 指向的对象中的n个字符拷贝
到dest 所指向的对象,返回指向结果对象的指针;
2.memmove 和 memcpy 函数在src和dest所指向内容不重叠是是一样的;区别就在于
memmove可以把自己的一部分拷贝到自己的的另一部分。
3.共同点就是都是对内存的的拷贝,对其安全性不必做太多的考虑;
所以拷贝 '/0',NULL;都可以进行拷贝,对类型没有要求;
都是以 n 为结束标志并不是'/0';所以拷贝字符串时慎用!*/
//这里用void* 来定义参数,用 char* 强制转换,实现一次读一个字节;
//直接上代码更暴力点!
>memcpy:
void* mymemcpy(void* dest,void*src,int num)//需要注意num不同情况的取值
{
char* tmpdest = (char*)dest;//这里的类型强制转换上面有提到
char* tmpsrc = (char*)src;
while(num--)
{
*tmpdest++ = *tmpsrc++;
}
return dest;
}
>memmove:memmove 考虑了两个地址是否有重叠
举个例子: dest指向"abcdef"的开始,src指向第三个字符'c',
要从src拷贝4个字符到dest中,如果正序拷贝势必会把src的内容
修改,所以memmove提供倒序拷贝!
void* mymemmove(void* dest,void*src,int num)
{
char* tmpdest = (char*)dest;
char* tmpsrc = (char*)src;
if(tmpdest < tmpsrc || tmpdest > (tmpsrc+num-1))
{
while(num--)
{
*tmpdest++ = *tmpsrc++;
}
}//如果地址没有重合其实和memcpy是一样的;
else
{
tmpdest+=num;
tmpsrc+=num;
while(num--)
{
*tmpdest-- = *tmpsrc--;
}
}
return dest;
}
int main()
{
char str[MAX];
char arr[] = "abcdef";
printf("%s\n",my_strcpy(str,arr));
system("pause");
return 0;
}
到这里就结束了,请大家指出不对的地方和可以优化的地方,我会多加改正!
谢谢!