zoukankan      html  css  js  c++  java
  • C++ string 是否以‘’结尾 讨论

    转载https://blog.csdn.net/qq_31930499/article/details/80374310
    之前在某篇文章中看到,C语言字符串是以’’结尾的,但是C++string类型的字符串并不是以’’结尾。话不多说,直接放代码(Cygwin64环境g++编译器):

    	string b("abc");
    	cout << b.capacity() << endl;
    	cout << b.size() << endl;
    	
    	if(b[3] == '')
    		cout << "yes" << endl;
    	else
    		cout << "no" << endl;
    
    

    运行结果:

    3
    3
    yes

    可以看到,字符串b大小和容量都是3,但是却可以使用b[3]越界访问,并且字符串的结尾就是’’。此刻,我心里想"abc"是C语言风格的字符串给b构造,肯定会把"abc"后面影藏的’’给构造进去。至于size和capacity是3,是因为这些方法进行了结尾处理,不计算最后一个’’,所以都是3。

    然后我再试了如下代码:

    	string a("abcd",3);
    	cout << a.capacity() << endl;
    	cout << a.size() << endl;
    	
    	if(a[3] == '')
    		cout << "yes" << endl;
    	else
    		cout << "no" << endl;
    
    

    结果跟上面一模一样。此刻我又想,构造函数会在末尾自动添加一个’’,并且size和capacity函数都不计算’’的。

    所以此刻,我肯定是矛盾的。因为最开始说string字符串是不以’’结尾的,但是测试下来,确实是以’’结尾的。

    经过一番查找,得出:

    std::string:标准中未规定需要作为字符串结尾。编译器在实现时既可以在结尾加,也可以不加。(因编译器不同

    但是,当通过c_str()或data()(二者在 C++11 及以后是等价的)来把std::string转换为const char
    *时,会发现最后一个字符是。但是C++11,string字符串都是以’’结尾。

    最后说一下,为什么C语言风格的字符串要以’’结尾,C++可以不要:

    c语言用char*指针作为字符串时,在读取字符串时需要一个特殊字符0来标记指针的结束位置,也就是通常认为的字符串结束标记。

    而c++语言则是面向对象的,长度信息直接被存储在了对象的成员中,读取字符串可以直接根据这个长度来读取,所以就没必要需要结束标记了。而且结束标记也不利于读取字符串中夹杂0字符的字符串。

    进一步来看string字符串,代码如下:

    	string a("abcd",3);
    	printf("%p
    ",&a);
    	printf("%p
    ",&a[0]);
            a[1] = 'X';
            cout << a << endl;
            printf("%p
    ",&a);
    	printf("%p
    ",&a[0]);
    	
    	string b("abc");
    	printf("%p
    ",&b);
            printf("%p
    ",&b[0]);
    	
    

    运行结果:

    0xffffcbe0
    0x6000003e8
    aXc
    0xffffcbe0
    0x6000003e8
    0xffffcbd8
    0x600000418

    由0xffffcbe0、0xffffcbd8可以看出,a,b类似于指针,他们所指的对象地址分别在0x6000003e8,0x600000418。所以a,b是栈变量,而所指的对象非栈变量。假设是文字常量,那么第四行执行会段错误,显然没有,排除。那么就是堆变量,地址也是向下增加的,符合要求。所以,string在构造函数的时候,会在堆上开辟一块内存存放字符串,并且指向这块字符串。

  • 相关阅读:
    web访问权限实现方法-探面向对象的编码设计
    解析二进制反码算数求和
    可以把erp当做一个分支-找自己的方向
    电脑开机是怎样自动加载进程
    球管模型和Java
    发明和发现
    漂浮
    js中的一些循环
    ES5中新增的一些方法
    git的一些操作
  • 原文地址:https://www.cnblogs.com/sunqiangstyle/p/10312282.html
Copyright © 2011-2022 走看看