首先来说一下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结果一样!
================================================
总结:strcpy
如果源长>目标长,则将源长中等于目标长的字符拷贝到目标字符串
如果源长<目标长,则源长全部拷贝到目标字符串,不包括'\0'
strncpy
如果目标长>指定长>源长,则将源长全部拷贝到目标长,自动加上'\0'
如果指定长<源长,则将源长中按指定长度拷贝到目标字符串,不包括'\0'
如果指定长>目标长,error happen!
strcpy:
char * strcpy(char * strDest, const char * strSrc) // 实现strSrc到strDest的拷贝
{
if ((strDest == NULL) || (strSrc == NULL)) //判断参数strDest和strSrc的有效性
{
return NULL;
}
char *strDestCopy = strDest; //保存目标字符串的首地址
while ((*strDest++ = *strSrc++)!='\0'); //把strSrc字符串的内容拷贝到strDest下
return strDestCopy;
}
strncpy:
#include <iostream>
using namespace std;
char *Strncpy(char * dest,const char * src,size_t num){
if( (dest == NULL) || (src == NULL))
return NULL;
char *strCpy = dest;
int i = 0;
while( (*dest++ = *src++) != '\0' && i < num)
i++;
return strCpy;
}
ps: size_t是unsigned int类型, 既然是无符号的,一般只能用在没有负数的地方.比如年龄啊,身高啊.在c标准函数中,最一般的就是strlen。