zoukankan      html  css  js  c++  java
  • string和c_str()使用时的坑

    先看一段代码和它的运行结果:


         看到结果了么这个运行的结果和我们理解的是不会有差距.对于经验丰富的开发者可能会微微一笑,但是对于一个刚刚学习的人就开始疑惑了.这里主要说两个问题:


         1、声明了一个string实例,使用c_str()进行赋值后,可以正常输出c_str()的值,但是直接输出string实例的实现,实际是空字符串


         2、在第一个问题后,对string实例进行字符串追加,然后对string和c_str()进行输出.原来对字符串变量被覆盖了.


        下面来具体分析下吧:


        c_str()接口是string类的一个函数,返回的是字符串的首地址,返回值类型是const char *的.如果要使用它并对其进行赋值操作,必须要使用strcpy函数.如果哦直接进行赋值,是不会赋值成功的.(小

    知识:const char *是指向常量字符串的指针.)


        在string类中.c_str()的生命周期受到string类实例的影响.如果我们使用string对象实例进行赋值,字符串被复制到一个char*的成员变量,然后在调用c_str()的时候,会直接返回string类中维护的

    char*成员的首地址.这样也就能保证了使用string和c_str()都能输出想要的字符值.


        但是,在ddemo中,先使用strcpy对const char *进行强转,然后进行赋值.虽然可以正常打印,但是对string对象中维护的成员没有正确的维护.所以,当进程再次使用string对象进行赋值时.新对字符

    串会覆盖老的字符串.使用c_str()打印的时候也是新的char*成员指向的地址.这样也就解释了在使用append对实例赋值时,后面打印的结果是追加字符串的值.


        其实,前面说的都是废话,用一句话就可以说明,就是:在使用string中的c_str()进行字符串赋值时,如果后面对string中的char*进行改变.那么c_str()中的值就不在可靠了.

  • 相关阅读:
    使用 Scrapy 爬取股票代码
    基于python开发的股市行情看板
    基于django的视频点播网站开发
    一个基于php+mysql的外卖订餐网站(带源码)
    线性表概述及单链表的Java实现
    使用github pages搭建个人博客
    解决SpannableString在Android组件间传递时显示失效的问题
    Android进程间通信(一):AIDL使用详解
    Hadoop HA高可用集群搭建(Hadoop+Zookeeper+HBase)
    Linux创建普通用户
  • 原文地址:https://www.cnblogs.com/newzol/p/8686076.html
Copyright © 2011-2022 走看看