#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char a[]="12345";
char b[6]="abcde";
char c[4]={0};
printf("---------------------------NO \\0------------------------------------\n");
printf("c:%s\n",c);
strncpy(c,b,4);
printf("c:%s\n",c);
printf("C[3]%c\n",c[3]);
printf("strlen%d\n",strlen(c));
printf("---------------------------have \\0------------------------------------\n");
c[3]='\0';
strncpy(c,b,3);
printf("c:%s\n",c);
printf("C[3]%c\n",c[3]);
return 0;
}
这个可以充分理解小陷阱
具体的原理我没有去探究
但是,我们可以知道在计算strlen的时候 是 '\0'结束的但是我们strncpy的时候可能没有包含'\0',
然后在使用 strlen 是一个非常危险的操作
这里要谨记
建议strncpy的时候添加检测 '\0'
最重要的部分是:
如果使用了strlen() 计算 字符串的长度lengthb。
malloc申请的时候 malloc(strlen( charvar))这个是错误的。
原因(1)strlen( charvar) 不包含'\0'在内
(2)char * test=(char *) malloc(strlen( charvar))申请的长度,尽管test可以存下charvar变量的内容,但是 少了 '\0'
程序运行是正常的,但这种方式及其不安全
正确的方式是:
char * test=(char *) malloc(strlen( charvar)+1)
这里的printf 也可研究一下 并且 你可以直接申明但不初始化 c变量,看看什么效果