zoukankan      html  css  js  c++  java
  • 关于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类对象的实例进行赋值时所产生的问题

    该问题参考该帖子

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

  • 相关阅读:
    POJ 2244 Eeny Meeny Moo (约瑟夫环问题)
    PHP中JavaScript使用的一个问题
    PHP和JavaScript跨域调用
    ExtJS中tree结合PHP的简单示例
    ExtJS中的Grid分页
    PHP、Smarty与jQuery Ajax 分页插件jquery.pager.js的使用
    jQuery版本不同及多次引用问题
    强大的Ext JS
    关于PHP中查询返回结果集和对象问题
    PHP中PDO方法fetch参数问题
  • 原文地址:https://www.cnblogs.com/zhuifeng-mayi/p/10801784.html
Copyright © 2011-2022 走看看