char *strncpy(
char *strDest,
const char *strSource,
size_t count
);
char *strcpy(
char *strDestination,
const char *strSource
);
两者功能基本一样。不同之处在于,strncpy多一个参数 count,即复制的字节数
strcpy函数:字符串复制函数
原型:extern
char
*strcpy(char
*dest,char
*src);
功能:把从src地址开始且含有NULL结束符的字符串赋值到以dest开始的地址空间,返回dest(地址中存储的为复制后的新值)。
要求:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
一般函数原型实现方式:
char
*
strcpy(char
*
strDest,const
char
*
strSrc)
{
char
*
strDestCopy=strDest;
//
if
((strDest==NULL)||(strSrc==NULL))
//
throw
"Invalid
argument(s)";
//
while
((*strDest++=*strSrc++)!='\0');
//
return
strDestCopy;
}
该函数的参数是字符指针,也就是可以是字符串变量和字符数组,因为它们的变量名代表首字符地址。字符串默认有一个null结束符,字符数组没有。所以此处需要注意:因为src要求有null结束符,所以字符数组的长度必须大于等于src包含null结束符的总长度。例如,char*
src="abcd";
char
dest;
这里dest的长度就至少为5。
strncpy函数:多个n代表可以指定字符个数进行赋值。
原型:char
*
strncpy(char
*dest,
char
*src,
size_tn);
功能:将字符串src中最多n个字符复制到字符数组dest中(它并不像strcpy一样遇到NULL才停止复制,而是等凑够n个字符才开始复制),返回指向dest的指针。
要求:如果n
>
dest串长度,dest栈空间溢出产生崩溃异常。该函数注意的地方和strcpy类似,但是n值需特别注意,
1)src串长度<=dest串长度,(这里的串长度包含串尾NULL字符)
如果n=(0,
src串长度),src的前n个字符复制到dest中。但是由于没有NULL字符,所以直接访问dest串会发生栈溢出的异常情况。这时,一般建议采取memset将dest的全部元素用null填充,如:memset(dest,0,7)(7为从dest起始地址开始前7个位置填充null,dest可以为字符指针和数组名)。注意:char*
pc="abc";
char
chs;
sizeof(pc)为4(包含null)(有些编译器不行),sizeof(chs)为5。
如果n
=
src串长度,与strcpy一致。
如果n
=
dest串长度,[0,src串长度]处存放于desk字串,(src串长度,
dest串长度]处存放NULL。
2)src串长度>dest串长度
如果n
=dest串长度,则dest串没有NULL字符,会导致输出会有乱码。如果不考虑src串复制完整性,可以将dest最后一字符置为NULL。
所以,一般把n设为dest(含null)的长度(除非将多个src复制到dest中)。当2)中n=dest串长度时,定义dest为字符数组,因为这时没有null字符拷贝。
标签:strcpy,strncpy,区别