实战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] = '\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())的更多相关文章
- 【转】char*,const char*和string的相互转换
1. string转const char* string s = "abc"; const char* c_s = s.c_str(); 2. const char*转string ...
- c++ string char* const char*
#include <iostream> #include <string> #include <cstring> using namespace std; int ...
- char*,const char*和string的相互转换
好久没写东西啦,发表学术文章一篇,hiahia~ 近日和小佳子编程时遇到很多转换问题,很麻烦,在网上查了很多资料. 为了以后查找方便,特此总结如下. 如果有不对的地方或者有更简单的方法,请指出~~ 1 ...
- (c++) int 转 string,char*,const char*和string的相互转换
一.int 和string的相互转换 1 int 转化为 string c++ //char *itoa( int value, char *string,int radix); // 原型说明: / ...
- string char * const char *之间的互相转换
string -> const char * 用str的c_str()方法或者data()方法均可,这个两个方法返回值为cong char * string str = "hel ...
- 实战c++中的string系列--string的替换、查找(一些与路径相关的操作)
今天继续写一些string操作. string给我们提供了非常多的方法,可是每在使用的时候,就要费些周折. 场景1: 得到一个std::string full_path = "D:\prog ...
- 实战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 ...
- 实战c++中的vector系列--知道emplace_back为何优于push_back吗?
上一篇博客说道vector中放入struct.我们先构造一个struct对象.再push_back. 那段代码中,之所以不能使用emplace_back,就是由于我们定义的struct没有显示的构造函 ...
- 实战c++中的vector系列--再谈vector的insert()方法(都是make_move_iterator惹的祸)
之前说过了关于vector的insert()方法,把vector B的元素插入到vector A中.vector A中的结果我们可想而知,可是vector B中的元素还会怎样? 看看之前写过的程序: ...
随机推荐
- Android Studio入门指南 (历上最全,全球首发)
下载地址:http://pan.baidu.com/s/1CEMma 8月份的时候因为Android开发团队全部使用Android Studio进行开发,所以我整理了Android Studio的一些 ...
- python 多进程,实际上都没有运行,sleep
进程以及状态 1. 进程程序:例如xxx.py这是程序,是一个静态的 进程:一个程序运行起来后,代码+用到的资源 称之为进程,它是操作系统分配资源的基本单元. 不仅可以通过线程完成多任务,进程也是可以 ...
- YMP运行初始化步骤
, Version.VersionType.Release); private static final Log _LOG = LogFactory.getLog(YMP.class); privat ...
- MySQL通过Explain查看select语句的执行计划结果触发写操作
[背景] 某某同学执行了一下Explain结果结果发现数据库有了一条写入操作,恭喜这位同学你的锅到货了,你签收一下: 对! 你没有听错,在一种场景下就算是Explain也会引发数据的写操作,就这是外层 ...
- 搭建Dubbo+Myeclipse2015+Maven3.3.1的过程遇到问题集锦
1. 找不到dubbo2.8.4包的问题 在编译Maven工程的过程中,出现如下问题: Description Resource Path Location Type ArtifactDescript ...
- Win7/Win8.1右键菜单技巧:应用程序任意加
对于Win7.Win8.1老用户来说,日常使用中离不开双击各类第三方应用程序,尤其是常用的记事本.QQ聊天.关机.一键截图等程序,这时我们不妨将这些“右键菜单”,轻松实现一键开启QQ.截图或者关机等功 ...
- Android 关于Fragment一些简单注意事项
1.Fragment的生命周期一定要了解清楚: 其实没有什么好说的. 注意关键字所执行的方法: 注意下面基本fragmentTransaction.replace();运行 当FragmentA(初始 ...
- Http Post 二进制通信
客户端请求和接收(使用了httpclient4.3 和netty3.5) public static void httpPost11() { CloseableHttpClient httpClien ...
- 深入理解Linux内核-进程地址空间
给内核分配内存和给用户态进程分配内存是有区别的:1.内核的优先级最高,如果某个内核函数请求动态内存,不会被延时2.内核信任自己,不必保护措施3.用户态进程对动态内存的请求被认为不是紧迫的,总是被尽量推 ...
- javascript 关于局部变量和全局变量
js中函数运行过程不仅仅是单纯的局部变量覆盖全局变量.和函数里面的声明情况有关. 比方: <script> var a =1; function test(){ alert(a); //a ...