首先因为printf函数输出字符串是针对char *的,即printf只能输出c语言的内置数据,而string不是c语言的内置数据。

其次string类型的对象不止包含字符串,还包含了许多用于操作的函数,所以&str并非字符串的首地址

因此该怎么打印string字符串呢?

1、利用string的成员函数c_str()打印,如下:

string q = "123ABCD";
printf("%s", q.c_str());

2、强转,将string类型强转成char*类型,如下:

string q = "123ABCD";
char* a = (char*)q.data();
printf("%s", a);

3、对string类对象的实例进行赋值时所产生的问题

该问题参考该帖子

https://www.cnblogs.com/newzol/p/8686076.html

先看下面的图片

先看看所出现的问题吧!

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

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

原因是什么呢?

_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()中的值就不在可靠了.

最新文章

  1. 在ubuntu上面配置nginx实现反向代理和负载均衡
  2. android 比较完善json请求格式
  3. Leetcode # 169, 229 Majority Element I and II
  4. C --gettimeofday===获取某个程序经历的时间
  5. BZOJ4348 : [POI2016]Park wodny
  6. NSNotificationCenter 的详细说明
  7. ubuntu 10.04 fcitx 4.12 实现按下shit切换输入法同时提交英文输入
  8. Nmap 源代码学习四 软件简单使用
  9. ubuntu 14.04 安装 Quartus II 13.1 过程
  10. DzzOffice管理员登陆方法和管理员应用介绍
  11. HTML5学习(十一)---服务器发送事件
  12. explain简介
  13. 技能CDDemo(点击鼠标左键实现技能界面旋转)
  14. break在switch中的使用例子
  15. Java http数据MD5、AES、DES加密
  16. jquery系列教程2-style样式操作全解
  17. GM8180_gpio内核模块调试
  18. 升级SCCM 2012R2 SP1故障解决
  19. java中,字符串和集合判断是否为空
  20. C#-基本语法(三)

热门文章

  1. A simple dynamic library implemented in C# 4.0 to deal with XML structure
  2. HBuilder X 中使用模拟器进行App开发
  3. IDEA 2019中一些有偏好设置
  4. 2019-2020 ICPC, Asia Jakarta Regional Contest C. Even Path
  5. python库 使用shutil来删除文件夹时报PermissionError时的解决方案
  6. [Comet OJ - Contest #6 C][48C 2279]一道树题_树
  7. Highest Frequency Letters
  8. [转帖]公钥基础设施(PKI)/CFSSL证书生成工具的使用
  9. java分词工具hanlp介绍
  10. 【LOJ】#3092. 「BJOI2019」排兵布阵