• 实战c++中的string系列--string与char*、const char *的转换(data() or c_str())


    在project中,我们也有非常多时候用到string与char*之间的转换,这里有个一我们之前提到的函数 c_str(),看看这个原型:

    const char *c_str();

    c_str()函数返回一个指向正规C字符串的指针, 内容与本string串同样.
    这就看到了吧,返回值是const char*,这里须要注意一下。

    1 string转const char*
    当然是用到上面所述的方法c_str():

    string s1 = "abcdeg";
    const char *k = s1.c_str();
    cout<<k<endl;

    还有还有一种方法:
    data():与c_str()相似。可是返回的数组不以空字符终止。

    2 string转char*
    能够使用strcpy:

    string s = "what fucking day";
    char* c;
    constint len = s.length();
    c =newchar[len+1];
    strcpy(c,s.c_str());

    也能够使用copy:

    int main()
    {
      std::string foo("quuuux");
      char bar[7];
      foo.copy(bar, sizeof bar);
      bar[6] = '';
      std::cout << bar << '
    ';
    }

    3 const char*转string
    4 char*转string
    简单了:

    char* c ="abc";
    string s(c);

    ================================================================
    上面提到了data和c_str的差别,那么到底差别在哪呢?
    二者原型:

    const value_type *c_str( ) const;
    const value_type *data( ) const;

    data仅仅是返回原始数据序列。没有保证会用traits::eos(),或者说’’来作字符串结束. 当然,可能多数实现都这样做了。
    c_str是标准的做法。返回的char* 一定指向一个合法的用’’终止的C兼容的字符串。


    所以,假设须要C兼容的字符串,c_str是标准的做法,data并不保证全部STL的实现的一致性。

    你也许会问。c_str()的功能包括data(),那还须要data()函数干什么?看看源代码:

    const charT* c_str () const
    {
    
       if  (length () == 0)
    
            return "";
    
       terminate ();
    
       return data ();
    
    }

    原来c_str()的流程是:先调用terminate()。然后在返回data()。

    因此假设你对效率要求比較高,并且你的处理又不一定须要以的方式结束。你最好选择data()。可是对于一般的C函数中,须要以const char*为输入參数。你就要使用c_str()函数。
    对于c_str() data()函数,返回的数组都是由string本身拥有,千万不可改动其内容。

    其原因是很多string实现的时候採用了引用机制,也就是说。有可能几个string使用同一个字符存储空间。并且你不能使用sizeof(string)来查看其大小。具体的解释和实现查看Effective STL的条款15:小心string实现的多样性。
    另外在你的程序中,仅仅在须要时才使用c_str()或者data()得到字符串,每调用一次。下次再使用就会失效,如:

    string strinfo("this is Winter");
    ...
    //最好的方式是:
    foo(strinfo.c_str());
    //也能够这么用:
    const char* pstr=strinfo.c_str();
    foo(pstr);
    //不要再使用了pstr了, 以下的操作已经使pstr无效了。

    strinfo += " Hello!"; foo(pstr);//错误!

    会遇到什么错误?当你幸运的时候pstr可能仅仅是指向”this is Winter Hello!”的字符串,假设不幸运。就会导致程序出现其它问题,总会有一些不可遇见的错误。

    总之不会是你预期的那个结果。

  • 相关阅读:
    archlinux 怎么样安装KDE界面
    选择Arch Linux还是Gentoo Linux?
    服务器用什么Linux系统较好?
    轻型简易的Linux桌面环境推荐
    扩大VMware虚拟机中linux硬盘空间
    archbang 硬盘安装
    持续改进中, Gnome Shell 2.91.3 发布
    群英战吕布 2010年十大Linux PK WIN7
    将LFSliveCD安装到硬盘的注意事项
    ArchLinux安装笔记(续)(桌面篇)
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7392241.html
Copyright © 2020-2023  润新知