在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. 转: 基于elk 实现nginx日志收集与数据分析

    原文链接:https://www.cnblogs.com/wenchengxiaopenyou/p/9034213.html 一.背景 前端web服务器为nginx,采用filebeat + logs ...

  2. SQL 教程数据库包括:Oracle, Sybase, SQL Server, DB2, Access 等等,您将学到如何使用 SQL 访问和处理数据系统中的数据

    SQL 基础教程 SQL 教程 SQL 简介 SQL 语法 SQL select SQL distinct SQL where SQL AND & OR SQL Order By SQL in ...

  3. java用String类的toUpperCase()和toLowerCase()方法转字符串的大小写

    1.如何判断英文字母的大小写: package com.ldw.string; import java.util.Scanner; /** * @author 作者:ldw E-mail: csu.l ...

  4. linux php7.1 安装redis扩展

    redis扩展下载网址 http://pecl.php.net/package/redis wget http://101.96.10.64/pecl.php.net/get/redis-3.1.3. ...

  5. Hadoop JobTracker和NameNode运行时参数查看

      1)JobTracker运行时参数: hadoop@ubuntu:/home/zhangchao3$ ps -ef | grep job hadoop 29563 1 0 11:34 pts/12 ...

  6. JDK1.5新特性,基础类库篇,XML增强

    Document Object Model (DOM) Level 3 文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口.DO ...

  7. Sql Server删除数据表中重复记录 三种方法

    本文介绍了Sql Server数据库中删除数据表中重复记录的方法. [项目]数据库中users表,包含u_name,u_pwd两个字段,其中u_name存在重复项,现在要实现把重复的项删除![分析]1 ...

  8. Java Web(十一) 分页功能的实现

    虽然现在有很多好用的框架,对分页进行支持,很简单的就把分页的效果做出来,但是如果自己手写是一个怎样的流程的?今天就来说说它,手动实现分页效果. --WH 一.分页的思路 首先我们得知道写分页代码时的思 ...

  9. iOS提交iTunes审核时出现Invalid Binary错误

    xcode5编译一个xcode4时写的代码,提交iTunes审核时出错. 1.iOS提交审核时出现Invalid Binary错误 2.收到邮件: iPhone 5 Optimization Requ ...

  10. Vivado下生成及烧写MCS文件

    Jtag模式: 1.打开Open Hardware Manager 2. Tools ->Auto Connect 3.TCL输入: write_cfgmem -format MCS -size ...