strcpy. memcpy.strncpy 函数
时间:2010-10-21 来源:wbwk2005
strcpy
作用:进行字符串拷贝,遇到‘\0’后结束拷贝,要求原串地址与目的串地址不能重合
函数原型:char * strcpy(char * des, const char * src)
{
assert((des!=NULL)&&(src!=NULL));
char *add=des;
while((*des++=*src++)!='\0');
return add;
}
memcpy:
功能:进行内存的拷贝,与strcpy的不同在于strcpy只能拷贝字串,即遇到\0就结束拷贝,但是本函数不管遇到什么都会继续拷贝,直到达到了既定的内存个数。
函数原型:
void * memcpy(void * des, const void *src, int count)
{
assert((des!=NULL)&&(src!=NULL));
void * add=des;
while(count-->0)
*des++=*src++;
return add;
}
strncpy函数:
功能:依然是字符串的拷贝,但是拷贝固定的字符个数,也需要受到\0的限制
原型:
char *strncpy(char * des, const char * src, int count)
{
assert((des!=NULL)&(src!=NULL));
char * add=des;
if(count<=strlen(src))
{
while(count-->0)
*des++=*src++;
for(int i=0;i<(sizeof(des)-count);i++)
* ++des='\0'
}
else if(count>=strlen(src)&&count<=strlen(des))
{
int n=strlen(src);
while(n-->0)
*des++=*src++;
for(int i=0;i<(strlen(des)-strlen(src));i++)
*++des='\0';
}
return add;
}
总结:strcpy
如果源长>目标长,则将源长中等于目标长的字符拷贝到目标字符串
如果源长<目标长,则源长全部拷贝到目标字符串,不包括'\0'
strncpy
如果目标长>指定长>源长,则将源长全部拷贝到目标长,自动加上'\0'
如果指定长<源长,则将源长中按指定长度拷贝到目标字符串,不包括'\0'
如果指定长>目标长,error happen!
strncpy为strcpy的一个安全版本:
列入:
strcpy和strncpy区别
第一种情况:
char* p="how are you ?";
char name[20]="ABCDEFGHIJKLMNOPQRS";
strcpy(name,p); //name改变为"how are you ? OPQRS " ====>错误!
strncpy(name,p,sizeof(name)) //name改变为"how are you ? " ====>正确!
第二种情况:
char* p="how are you ?";
char name[20];
strcpy(name,p); //name改变为"how are you ? 未知字符 " ====>错误!
name[sizeof(name)-1]='\0' //和上一步组合,得到正确的结果!
strncpy(name,p,sizeof(name)); //name改变为"how are you ? " ====>正确!
第三种情况:
char* p="how are you ?";
char name[10];
strcpy(name,p); //name改变为"how are yo" ====>无结束符'\0',错误!
name[sizeof(name)-1]='\0' //和上一步组合,弥补结果。但要注意,字符传递错误!
strncpy(name,p,sizeof(name)); //和单纯的一步strcpy结果一样!