实战c++中的string系列--string与char*、const char *的转换(data() or c_str())
来源:互联网 发布:python 2.7基础教程 编辑:程序博客网 时间:2024/05/16 09:39
在工程中,我们也有很多时候用到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())
- string的c_str和data()的运用,转为const char *
- 如何从string 转换为const char *和char * (附带string中c_str()、data()、copy(p,n)函数的用法)
- string 与char*,const char*, char[]之间的转换
- string 与char* 、char[]、const char*之间的转换
- C/C++中的char*,const char*,string之间转换
- c_str string 转换成char
- c_str():string转换成char*
- c++ string使用c_str转换成const char*
- 【C++】char*,const char*,string的相互转换
- string char const char之间的转换
- char*,const char*,string的相互转换
- string const char *和char *的转换
- string\const char*\char*转换
- string, char*, const char*转换
- 【C\C++】char[] 与 string 的转换
- char*,const char*,char[],string之间的转换问题。
- const char *,char * ,string,char []之间的关系和转换
- 关于大端小端的解说
- 安卓错误总结:Invalid file name: must contain only [a-z0-9_.]
- mysql5.7.9编译
- 完全卸载mysql
- 算法学习:图的深度优先遍历(DFS)
- 实战c++中的string系列--string与char*、const char *的转换(data() or c_str())
- CUDA学习笔记之 CUDA存储器模型
- 也来说说关于Hibernate使用update更新数据时,不更新的问题
- 创建SQL server 2008 R2的事务复制
- AngularJs实战(五)
- CSS之box-shadow
- 单片机——我的第一个程序
- MongoDB 3.0+ 安全权限访问控制
- ubuntu系统根目录下各个目录用途说明