在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] = '\0';
std::cout << bar << '\n';
}

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(),或者说’\0’来作字符串结束. 当然,可能多数实现都这样做了。

c_str是标准的做法。返回的char* 一定指向一个合法的用’\0’终止的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()。

因此假设你对效率要求比較高,并且你的处理又不一定须要以\0的方式结束。你最好选择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!”的字符串,假设不幸运。就会导致程序出现其它问题,总会有一些不可遇见的错误。

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

实战c++中的string系列--string与char*、const char *的转换(data() or c_str())的更多相关文章

  1. 【转】char*,const char*和string的相互转换

    1. string转const char* string s = "abc"; const char* c_s = s.c_str(); 2. const char*转string ...

  2. c++ string char* const char*

    #include <iostream> #include <string> #include <cstring> using namespace std; int ...

  3. char*,const char*和string的相互转换

    好久没写东西啦,发表学术文章一篇,hiahia~ 近日和小佳子编程时遇到很多转换问题,很麻烦,在网上查了很多资料. 为了以后查找方便,特此总结如下. 如果有不对的地方或者有更简单的方法,请指出~~ 1 ...

  4. (c++) int 转 string,char*,const char*和string的相互转换

    一.int 和string的相互转换 1 int 转化为 string c++ //char *itoa( int value, char *string,int radix); // 原型说明: / ...

  5. string char * const char *之间的互相转换

    string  ->   const char * 用str的c_str()方法或者data()方法均可,这个两个方法返回值为cong char * string str = "hel ...

  6. 实战c++中的string系列--string的替换、查找(一些与路径相关的操作)

    今天继续写一些string操作. string给我们提供了非常多的方法,可是每在使用的时候,就要费些周折. 场景1: 得到一个std::string full_path = "D:\prog ...

  7. 实战c++中的vector系列--vector应用之STL的find、find_if、find_end、find_first_of、find_if_not(C++11)

    使用vector容器,即避免不了进行查找,所以今天就罗列一些stl的find算法应用于vector中. find() Returns an iterator to the first element ...

  8. 实战c++中的vector系列--知道emplace_back为何优于push_back吗?

    上一篇博客说道vector中放入struct.我们先构造一个struct对象.再push_back. 那段代码中,之所以不能使用emplace_back,就是由于我们定义的struct没有显示的构造函 ...

  9. 实战c++中的vector系列--再谈vector的insert()方法(都是make_move_iterator惹的祸)

    之前说过了关于vector的insert()方法,把vector B的元素插入到vector A中.vector A中的结果我们可想而知,可是vector B中的元素还会怎样? 看看之前写过的程序: ...

随机推荐

  1. 常用代码之三:jQuery为按钮绑定事件的代码

    如题,比如有一个按钮:<input type='button' class='btn-text' id ='addHtml' value='新增' /> 为它添加onclick事件的代码: ...

  2. C#基础第九天-作业答案-储蓄账户(SavingAccount)和信用账户(CreditAccount)

    class Bank { //Dictionary<long,Account> dictionary=new Dictionary<long,Account>(); DataT ...

  3. Android app启动activity并调用onCreate()方法时都默默地干了什么?

    Android app启动activity并调用onCreate() 方法时都默默地干了什么?   在AndroidManifest.xml文件中的<intent-filter>元素中有这 ...

  4. php分享二十九:命名空间

    1:命名空间的命名不区分大小写 2:namespace必须在所有代码之前,除了declare语法以外(不过他之前可以有注释,空行等) 3:只有以下类型的代码受命名空间的影响,它们是:类(包括抽象类和t ...

  5. 在 Visual Studio 2017 中找回消失的“在浏览器中查看”命令

    不知为何,在新安装 Visual Studio 2017 后,发现所有 Web 项目上右键菜单的"在浏览器中查看"命令消失了,只能以调试模式启动网站,非常别扭. 最后在 Stack ...

  6. Android Studio 解决 Gradle 依赖冲突的问题

    Android Studio 解决 Gradle 依赖冲突的问题 参考链接: Android Studio(Gradle)解决库依赖冲突问题:http://www.mobibrw.com/2016/3 ...

  7. 看了一下unity5.6的新功能 以及Timeline

    3月31日unity5.6发布,然而timeline(前sequence模块)被delay到unity 2017.上个星期官方又发布了unity 2017的beta版本 抽空看了下 (unity5.6 ...

  8. c#中lock的使用(用于预约超出限额的流程)

    一个项目,预约系统,核心二张表:预约表,预约限额表 用户点击预约按钮后, 1. 先select 预约限额表把该预约时间段的限额取出来, 2. 再select 预约表把该预约时间已经预约上的次数算出来 ...

  9. OpenMP基础使用

    OpenMP是CPU并行加速相关的编译处理方案,VS非常早的版本号就对其提供了支持,只是默认是关闭的.要开启这一支持.仅仅须要在项目的属性中设置就能够,详细选项为:配置属性->C/C++-> ...

  10. ExtJs--05--给window组件加入功能条以及子组件获取上级或下级组件的属性和方法

    Ext.onReady(function(){ /** 1-- 给容器组件加入控制条 及 控制项 控制条 不同的方向有多种 tbar lbar rbar bbar fbar 2-- 依据组件本身拿到上 ...