strcpy与strncpy用法与区别

strcpy与strncpy用法与区别

  • strcpy函数:把从src地址开始含有NULL结束符的字符串复制到以dest开始的地址空间,返回dest。要求:src和dest所指的内存区域不可以重叠且dest必须有足够的空间来容纳src字符串。函数原型为: extern char strcpy(char dest, char src);
1
2
3
4
5
6
7
char *strcpy( char* strDest, const char *strSrc){
char *strDestCopy = strDest;
if((strDest==NULL)||(strSrc==NULL))
throw "Invalid arguments";
while((*strDest++ = *strSrc++)!='\0');
return strDestCopy;
}

该函数的参数是字符指针,也就是可以是字符串变量和字符数组,因为它们的变量名代表字符地址。字符串默认有一个以null的结束符,字符数组没有。所以此处需要注意:因为src要求有null结束符,所以字符数组的长度必须大于等于src包含null结束符的总长度。例如,char *src=”abcd”;char dest[5] ;这里的dest的长度至少为5;

  • strncpy函数:n代表可以指定字符个数进行赋值。原型:char strncpy(char dest, char *src, size_t n);功能:将字符串src最多n个字符复制到字符数组dest中(它并不像strcpy一样遇到NULL才停止复制,而是等凑够n个字符才开始复制),返回指向dest的指针。要求:如果n > dest串长度,dest栈空间溢出产生崩溃异常。

    1. src串长度 <= dest串长度(这里的串长度包含串尾NULL字符)
      如果 n = (0, src串长度),src的前n个字符复制到dest中。但是由于没有NULL字符,所以直接访问dest会发生乱码。这时,一般建议采用memset将dest的全部元素用null填充,如memset(dest, 0, 7)

      如果n=src串长度,与strcpy一致。
      如果n=dest串长度,[0, src串长度]处存放src字符串,(src串长度,dest串长度]处存放NULL。

    2. src串长度 > des串长度
      如果n = dest串长度,则dest串没有null字符,会导致输出有乱码。如果不考虑src串复制完整性,可以将dest最后一个字符置为NULL。

所以,一般把n设为dest(含null)的长度,当n=dest串长度时,定义dest为字符数组,因为这时没有null字符拷贝。