strncpy函数原型
编辑
函数原型char *strncpy(char *dest,char *src,size_t n);
功能
编辑
(c/c++)复制字符串src中的内容(字符,数字、汉字....)到字符串dest中,复制多少由size_t n的值决定。如果src的前n个字符不含NULL字符,则结果不会以NULL字符结束。如果n<src的长度,只是将src的前n个字符复制到dest的前n个字符,不自动添加'\0',也就是结果dest不包括'\0',需要再手动添加一个'\0'。如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符长度+'\0'。举例:
1
2
3
4
5
6
7
8
#include<stdio.h>
#include<string.h>
int
main(){
char
name[]={
"Chinanet"
},dest[20]={};
strncpy
(dest,name,3);
dest[3]=
'\0'
;
//没有会乱码
printf
(
"%s\n"
,dest);
}
1)src串长度<=dest串长度,(这里的串长度包含串尾NULL字符)
如果n>src,只复制src的前n个字符;如果n = src串长度,则与strcpy一致;如果n>src,正常复制,特别注意,如果src中有NULL,strncpy复制到NULL即使没到n也提前停止。注意n的选择:当n > dest串长度,dest栈空间溢出产生崩溃异常。
2)src串长度>dest串长度
如果n =dest串长度,则dest串没有NULL字符,会导致输出会有乱码。如果不考虑src串复制完整性,可以将dest 最后一字符置为NULL。
总结:
1. 一般情况下,使用strncpy时,建议将n置为dest串长度(或者取sizeof(dest)-1
),复制完毕后,为保险起见,将dest串最后一字符置NULL,避免发生在第2)种情况下的输出乱码问题。
2. 也先定义并初始化char str[MAX + 1] = {0}; 如果在程序中间需要再往str中拷贝串,一定要用memset清零。使用格式为:strncpy(dest,src, sizeof(dest) - 1) 。
3.strncpy拷贝的是字符,不拷贝串,所以最后一个\0没有拷贝,所以,拷贝的时候需要对串进行清零处理,一定要养成好习惯。
4.strncpy拷贝时,可能会导致截断,但程序不会崩溃。