关注C++细节——字面值初始化字符数组及字符串拷贝注意
来源:互联网 发布:office2016破解软件 编辑:程序博客网 时间:2024/05/01 18:57
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;
这样两条指令配合使用就不会发生错误了,所以,这里两行指令是拷贝字符串最安全的写法了(个人觉得)。
本人新的博客地址 凌风技术站
4 0
- 关注C++细节——字面值初始化字符数组及字符串拷贝注意
- 关注C++细节——字面值初始化字符数组及字符串拷贝注意
- c语言中 字符数组与字符串字面值 字符数组与字符指针数组
- day10 指针、字符串字面值、字符数组
- 关注C++细节——动态生成对象初始化细节
- C语言字符数组和字符串注意
- 字符字面量及字符串的特点
- 关注C++细节——写头文件注意
- 关注C++细节——static类成员使用注意
- C语言—字符串(字符数组)
- 关于内存及字符数组,字符串的一些注意点
- 字符串与字符数组初始化及长度计算
- 字符数组、字符串的声明及初始化问题
- c字符数组初始化方式和字符串常量
- 字符数组(C风格字符串)的初始化和赋值
- C初始化字符串指针和二维字符数组
- 【C++】字符串——字符数组和字符指针浅谈
- 数组方式赋值字符串及字面值常量赋值字符串的区别
- ckermit 使用xcom 协议发送文件
- android取消开机时候的震动
- ubuntu安装nfs中的一些问题总结
- sscanf的基本用法
- 高并发量网站解决方案
- 关注C++细节——字面值初始化字符数组及字符串拷贝注意
- ListviewFilter 对A-Z排序 过滤 搜索功能(为github高手所做)
- Intellij IDEA 配置Tomact
- ant删除文件操作
- sql----改写 in ,exists,not in ,not exists
- Linux系统对IO端口和IO内存的管理
- Given an array of integers, every element appears twice except for one. Find that single one.
- 使用共用体存储各类型数据到EEPROM
- 安卓开发sdk选择和兼容问题