C++ string 是否以‘\0’结尾 讨论
转载https://blog.csdn.net/qq_31930499/article/details/80374310
之前在某篇文章中看到,C语言字符串是以’\0’结尾的,但是C++string类型的字符串并不是以’\0’结尾。话不多说,直接放代码(Cygwin64环境g++编译器):
string b("abc");
cout << b.capacity() << endl;
cout << b.size() << endl;
if(b[3] == '\0')
cout << "yes" << endl;
else
cout << "no" << endl;
运行结果:
3
3
yes
可以看到,字符串b大小和容量都是3,但是却可以使用b[3]越界访问,并且字符串的结尾就是’\0’。此刻,我心里想"abc"是C语言风格的字符串给b构造,肯定会把"abc"后面影藏的’\0’给构造进去。至于size和capacity是3,是因为这些方法进行了结尾处理,不计算最后一个’\0’,所以都是3。
然后我再试了如下代码:
string a("abcd",3);
cout << a.capacity() << endl;
cout << a.size() << endl;
if(a[3] == '\0')
cout << "yes" << endl;
else
cout << "no" << endl;
结果跟上面一模一样。此刻我又想,构造函数会在末尾自动添加一个’\0’,并且size和capacity函数都不计算’\0’的。
所以此刻,我肯定是矛盾的。因为最开始说string字符串是不以’\0’结尾的,但是测试下来,确实是以’\0’结尾的。
经过一番查找,得出:
std::string:标准中未规定需要\0作为字符串结尾。编译器在实现时既可以在结尾加\0,也可以不加。(因编译器不同)
但是,当通过c_str()或data()(二者在 C++11 及以后是等价的)来把std::string转换为const char
*时,会发现最后一个字符是\0。但是C++11,string字符串都是以’\0’结尾。
最后说一下,为什么C语言风格的字符串要以’\0’结尾,C++可以不要:
c语言用char*指针作为字符串时,在读取字符串时需要一个特殊字符0来标记指针的结束位置,也就是通常认为的字符串结束标记。
而c++语言则是面向对象的,长度信息直接被存储在了对象的成员中,读取字符串可以直接根据这个长度来读取,所以就没必要需要结束标记了。而且结束标记也不利于读取字符串中夹杂0字符的字符串。
进一步来看string字符串,代码如下:
string a("abcd",3);
printf("%p\n",&a);
printf("%p\n",&a[0]);
a[1] = 'X';
cout << a << endl;
printf("%p\n",&a);
printf("%p\n",&a[0]);
string b("abc");
printf("%p\n",&b);
printf("%p\n",&b[0]);
运行结果:
0xffffcbe0
0x6000003e8
aXc
0xffffcbe0
0x6000003e8
0xffffcbd8
0x600000418
由0xffffcbe0、0xffffcbd8可以看出,a,b类似于指针,他们所指的对象地址分别在0x6000003e8,0x600000418。所以a,b是栈变量,而所指的对象非栈变量。假设是文字常量,那么第四行执行会段错误,显然没有,排除。那么就是堆变量,地址也是向下增加的,符合要求。所以,string在构造函数的时候,会在堆上开辟一块内存存放字符串,并且指向这块字符串。
C++ string 是否以‘\0’结尾 讨论的更多相关文章
- java, double转String, 去掉0结尾的小数位
小问题:double值的小数位是0时,转String会有“.0”结尾.比如,double值是“12”,转String得到的字符串是“12.0”.如果需要去掉0结尾的小数位,应当如何解决呢? 解决方案: ...
- Java中字符串为什么不以\0结尾
Java中字符串为什么不以\0结尾 其实这个问题没有什么好说的,Java里面一切都是对象,是对象的话,字符串肯定就有长度,即然有长度,编译器就可以确定要输出的字符个数,当然也就没有必要去浪费那1字节的 ...
- Entity Framework 6 执行Linq to Entities异常"p__linq__1 : String truncation: max=0, len=2, value='测试'"
场景再现 我需要查询公司名称包含给定字符串的公司,于是我写了下面的测试小例子: var condition = "测试"; var query = from b in db.Com ...
- VK Cup 2012 Qualification Round 2 C. String Manipulation 1.0 字符串模拟
C. String Manipulation 1.0 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 codeforces.com/problemset/pr ...
- weblogic部署异常: cvc-enumeration-valid: string value '3.0' is not a valid enumeration value for web-app-versionType in namespace http://java.sun.com/xml/ns/javaee:<null>
尝试使用weblogic部署一个Demo应用,在选择应用目录后,报出下面的异常: VALIDATION PROBLEMS WERE FOUND problem: cvc-enumeration-val ...
- String字符串补0操作常见方法
String前补0 java的String字符串补0或空格 方法一:自己写的方法 /* *数字不足位数左补0** @param str* @param strLength*/public stati ...
- CodeForces 159c String Manipulation 1.0
String Manipulation 1.0 Time Limit: 3000ms Memory Limit: 262144KB This problem will be judged on Cod ...
- string 从下标0 一直截到倒数第三位
StringUtils.substring(String.valueOf(maxSequence), 0, -3)如上,关键就是那个-3,表示倒数第三位.
- vue.esm.js?efeb:628 [Vue warn]: Invalid prop: type check failed for prop "defaultActive". Expected String with value "0", got Number with value 0.
vue.esm.js?efeb:628 [Vue warn]: Invalid prop: type check failed for prop "defaultActive". ...
随机推荐
- ubuntu安装Android Studio
参考 https://developer.android.com/guide/?hl=zh-CN 下载 https://developer.android.com/studio/?hl=zh-CN 解 ...
- Android Studio:Gradle project refresh failed. 解决方法
事件 换了个电脑,Android Studio拷过来,重新配置后,打开已有的项目,报错: Gradle project refresh failed. Connection timed out: co ...
- 美国诚实签经验——中英文行程单、往返机票、用英语面试的申请者通过率>用中文面试的申请者的通过率、一直保持着微笑,看上去很自信,也很诚恳、户口簿带上最好
在排队等待时据我的观察,用英语面试的申请者通过率>用中文面试的申请者的通过率.一家人申请通过率>单个人通过率:商务签证通过率>旅游签证通过率 一. 面签材料 1. 必备材 ...
- [翻译]NUnit--前言(一)
前言: 翻译这个系列主要是自己在学习NUnit之时看英文文档大部分能看懂但是有些还是功底不足,所以在方便自己以后再学习的时候可以快速查找,也能够加深印象以及掌握的更好.同时在搜索网上关于NUnit系列 ...
- TI BLE : GAP Bond Manager
// Setup the GAP Bond Manager { uint32 passkey = 0; // passkey "000000" uint8 pairMode = G ...
- hive 内部表与外部表的区别
hive 内部表: hive> create table soyo55(name STRING,addr STRING,money STRING) row format delimited fi ...
- IE6的3像素BUG产生条件及解决方法
1.IE6中第一个元素浮动第二个元素不浮动,这两个元素之间就会产生3像素BUG 2.解决方案: 2.1若若宽度一定则给第二个元素添加 float 样式即可: 2.2若宽度自适应: 2.2.1 _ma ...
- P2339 提交作业usaco(区间dp)
P2339 提交作业usaco 题目背景 usaco 题目描述 贝西在哞哞大学选修了 C 门课,她要把所有作业分别交给每门课的老师,然后去车站和同学们一起回家.每个老师在各自的办公室里,办公室要等他们 ...
- git stash 切换分支以后 恢复
场景: 我在A分支开发 突然要去B分支改东西 但是A分支还没开发完 B又比较着急 又不想提交A 但是不提交又切换不到B 于是就发现有个git stash 将当前修改(未提交的代码)存入缓存区,切换分支 ...
- sql server 大数据处理
对SQL Server数据表进行分区的过程分为三个步骤: 1)建立分区函数 2)建立分区方案 3)对表格进行分区 第一个步骤:建立分区函数 分区函数定义[u]how[/u],即你想要SQL Serve ...