关注C++细节——字面值初始化字符数组及字符串拷贝注意
2014-05-23 10:59
435 查看
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;
这样两条指令配合使用就不会发生错误了,所以,这里两行指令是拷贝字符串最安全的写法了(个人觉得)。
相关文章推荐
- 关注C++细节——字面值初始化字符数组及字符串拷贝注意
- C/C++字符串,字符数组,字符指针及其相互静态拷贝与追加的安全问题解决方案(1)
- 设计算法并写出代码移除字符串中重复的字符,不能使用额外的缓存空间。注意: 可以使用额外的一个或两个变量,但不允许额外再开一个数组拷贝。
- C/C++字符串,字符数组,字符指针及其相互静态拷贝与追加的安全问题解决方案(2)
- 在C++中字符数组和字符串
- C++字符数组表示字符串--易错标识
- (29)'c++:COMPLETE REFERENCE' 第一部分 第四章(数组和以空字符结束的字符串) 第四节
- 关注C++细节——浅谈指针使用中注意事项
- 关于字符数组 和 字符串比较 C++
- (27)'c++:COMPLETE REFERENCE' 第一部分 第四章(数组和以空字符结束的字符串) 第二节
- (28)'c++:COMPLETE REFERENCE' 第一部分 第四章(数组和以空字符结束的字符串) 第三节
- 【基础知识】c++字符串中需要注意的一些细节
- C/C++——字符串和字符数组
- (34)'c++:COMPLETE REFERENCE' 第一部分 第四章(数组和以空字符结束的字符串) 第九节
- 常用的字符串和字符数组的转换和注意点
- (30)'c++:COMPLETE REFERENCE' 第一部分 第四章(数组和以空字符结束的字符串) 第五节
- c++中字符数组与字符串的转换
- C++ 与“类”有关的注意事项总结(十):类对象数组初始化(三种方法)
- 单片机—C语言char数组和字符串赋值、拷贝、附加注意事项
- 关注C++细节——static类成员使用注意