您的位置:首页 > 编程语言 > C语言/C++

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

2017-06-18 01:13 483 查看
[html] view
plain copy

 print?

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

 

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

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

[cpp] view
plain copy

 print?

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);这个函数在用的时候要注意,如下

 

[cpp] view
plain copy

 print?

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)就会出错。如下

 

[cpp] view
plain copy

 print?

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

char dest[] = "he";  

 

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

 

[cpp] view
plain copy

 print?

strncpy(dest,src,sizeof(dest));  

dest[sizeof(dest)-1] = 0;  

转载:http://blog.csdn.net/iaccepted/article/details/26681203

 

这样两条指令配合使用就不会发生错误了,所以,这里两行指令是拷贝字符串最安全的写法了(个人觉得)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐