在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. MySQL复制表结构、表数据

    1.复制表结构及数据到新表 CREATE TABLE 新表SELECT * FROM 旧表 这种方法会将oldtable中所有的内容都拷贝过来,当然我们可以用delete from newtable; ...

  2. MIUI 们的发展蓝图:“罪恶”秘密背后的金钱和机遇

    (原文来自 AllThingsD)   听起来有点唬人,但是移动变革的确是这个时代最大的一次技术平台升级事件.这场趋势实在太浩大,不断地循环往复,对于创业者(还有像我这样的投资人来说),则意味着令人激 ...

  3. django 用户管理相关的表

    Django 用户管理相关的表: create table django_content_type ( /* 内容类型表 */ id ) not null auto_increment, app_la ...

  4. Hadoop创建/删除文件夹出错

    log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFact ...

  5. php分享二十二:php面向对象

    1:static访问符 在类中使用static有两种主要用途.定义静态成员和定义静态方法.静态成员只保留一个变量的值,这个值对所有实例都是有效的 类的方法是static的,他所访问的属性也必须是sta ...

  6. CSS边框闪烁呼吸样式

    <html> <body> <head> .arrow_box{animation: glow 800ms ease-out infinite alternate; ...

  7. 含有按钮的ScrollView在iOS8中无法滚动的解决办法 | ScrollView with UIControl/UIButton subviews not scrollable under iOS 8

    转自:http://zcw.me/blogwp/%E5%90%AB%E6%9C%89%E6%8C%89%E9%92%AE%E7%9A%84scrollview%E5%9C%A8ios8%E4%B8%A ...

  8. Unity Shaders and Effects Cookbook (4-1)(4-2)静态立方体贴图的创建与使用

    開始学习第4章 - 着色器的反射 看完了1.2节,来记录一下.反射主要是利用了 Cubemap 立方体贴图. 认识Cubemap 立方体贴图.就如同名字所说.在一个立方体上有6张图.就这样觉得吧. 假 ...

  9. <![CDATA[]]>和转义字符

    被<![CDATA[]]>这个标记所包含的内容将表示为纯文本,比如<![CDATA[<]]>表示文本内容“<”. 此标记用于xml文档中,我们先来看看使用转义符的情 ...

  10. 使用JSR-303进行后台数据校验

    一.在SringMVC中使用 使用注解 1.准备校验时使用的JAR validation-api-1.0.0.GA.jar:JDK的接口: hibernate-validator-4.2.0.Fina ...