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