关于C语⾔打印string类字符串的问题
⾸先因为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类对象的实例进⾏赋值时所产⽣的问题
该问题参考该帖⼦
先看下⾯的图⽚
先看看所出现的问题吧!
1、声明了⼀个string实例,使⽤c_str()进⾏赋值后,可以正常输出c_str()的值,但是直接输出string实例的实现,实际是空字符串
2、在第⼀个问题后,对string实例进⾏字符串追加,然后对string和c_str()进⾏输出.原来对字符串变量被覆盖了.
原因是什么呢?
_str()接⼝是string类的⼀个函数,返回的是字符串的⾸地址,返回值类型是const char *的.如果要使⽤它并对其进⾏赋值操作,必须要使⽤strcpy函数.如果哦直接进⾏赋值,是不会赋值成功的.(⼩
知识:const char *是指向常量字符串的指针.)
c++string类型
在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()中的值就不在可靠了.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。