/*
//源 <= 目标
char*p="123456789";
char name1[12]="aaaaaaaaaaa",
char name2[12]="bbbbbbbbbbb";
strcpy(name1,p); //遇空字符结束,结果追加1个空字符:123456789/0
strncpy(name2,p,5); //若n>=源,则不足的部分填充/0,结果:123456789/0/0/0
//若n<源例如=5,则只拷贝5个字符,结果:12345bbbbbb/0
*/
/*
//源 > 目标
char name3[6]; //内存地址:0x0012f420
char name1[4]="aaa"; //内存地址:0x0012f41c
char name2[4]="bbb"; //内存地址:0x0012f418
char*p="12345678";
strcpy(name1,p); //发生溢出,数据写到了name3的空间
//结果:name1:1234,name3:5678/0/?
strncpy(name2,p,2); //若n>=源例如=10,则大于的部分填充空字符,
//但是发生溢出,数据覆盖了name1和name3的空间
//结果:name1:5678,name2:1234,name3:/0/078/0/?
//若n<源,>目标,例如=6,数据覆盖了name1
//name1:5634,name2:1234
//若n=目标,name2:1234
//若n<目标例如=2,name2:12b/0
*/
/*
//源字符串无结束符
char p[9]={'1','2','3','4','5','6','7','8','9'};
char p2[9]={'1','2','/0','4','5','6','7','8','9'};
char name3[12];
char name1[12]="aaaaaaaaaaa";
char name2[6]="bbbbb";
strcpy(name1,p); //会痴情地苦苦寻找结束符,
strncpy(name2,p2,12); //会忠实地拷贝12个,不管是什么
//拷贝过程中遇到/0,之后都填充/0
*/
/*
结论:
1、使用strcpy时一定不能用于无结束符的字符串,因为strcpy依赖/0判断源字符串的结束
2、使用strncpy注意n值一定要<=源字符串,因为strncpy依赖参数n来控制拷贝源的长度
3、strcpy 和strncpy 对目标空间都不做溢出检查,应保证大于操作数据
*/