首页 > 代码库 > 关注C++细节——字面值初始化字符数组及字符串拷贝注意

关注C++细节——字面值初始化字符数组及字符串拷贝注意

char carr[] = "author:CSDN-iaccepted";

 

此时,carr数组中元素的个数为21,最后一个位置用来存放空字符‘\0‘。

所以如果写成carr[21] = "author:CSDN-iaccepted";就是错误的。

int clen = strlen(carr);
int size = sizeof(carr);


这时候得到的clen = 21,size= 22。这就是因为strlen统计串中字符的个数,不计算最后的空字符,但是sizeof 是得到carr这整个字符串分配的内存大小,因为最后必须留一个位置来存放空字符,所以,占用22个内存单元,又因为1个字符类型占用1个字节,所以结果返回22(22个字节的内存空间)。

 

strcpy(char *dest,const char *src);这个函数在用的时候要注意,如下

 

char src[] = "helloworld";
char dest[] = "hello";


这个时候执行strcpy(dest,src);会导致程序溢出而崩溃,所以通常的方法就是使用strncpy来代替strcpy。

strncpy的最后一个参数为size_t 类型的计数count,指明要拷贝长度。这个长度指定为strlen(dest)很合适了,因为strlen返回值不计算最后一个空字符,这样,src字符串的长度如果超过dest,那么只会拷贝跟dest一样的长度,这样dest的末尾正好还是有一个空字符的,这样是不会出错的。但是有的时候我们定义的src不一定含有末尾的空字符,这个时候strlen(str)就会出错。如下

 

char src[] = {'h','e','l','l','o'};
char dest[] = "he";


 

这个时候就不能将拷贝长度指定为strlen(dest),所以一般情况下指定为strlen(dest)是非常危险的操作。这个时候要用到的就是sizeof了。

 

strncpy(dest,src,sizeof(dest));
dest[sizeof(dest)-1] = 0;


 

这样两条指令配合使用就不会发生错误了,所以,这里两行指令是拷贝字符串最安全的写法了(个人觉得)。