basic_string::c_str() 与 basic_string::data() 区别
来源:互联网 发布:navicat连不上数据库 编辑:程序博客网 时间:2024/05/24 06:31
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!"的字符串,如果不幸运,就会导致程序出现其他问题,总会有一些不可遇见的错误。总之不会是你预期的那个结果。
- basic_string::c_str() 与 basic_string::data() 区别
- basic_string::c_str() 与 basic_string::data() 区别
- basic_string::c_str() 与 basic_string::data() 区别
- C++_string_basic_string::c_str() 与 basic_string::data() 区别
- difference between data() and c_str() of basic_string
- basic_string
- basic_string
- ATL::CStringT与std::basic_string
- basic_string 介绍
- class basic_string
- basic_string::replace
- basic_string::append
- string::c_str() 与 string::data() 区别
- basic_string::substr 异常退出
- STL源码阅读 -- basic_string
- STL之basic_string
- std::basic_string::compare
- string类的data()与c_str()的区别
- 我也来无符号定位驱动入口
- 27条搞笑短信
- 学java必须清楚的东西
- 量产 教你如何把U盘做成CD-ROM,以后装机可以不用带光盘和光驱0
- 典型J2EE系统架构图,该图为了自己使用而创建,如有什么不当的地方还请高手们指正,谢谢!
- basic_string::c_str() 与 basic_string::data() 区别
- 如何制作deb包
- 在eclipse中解决”Unsupported major.minor version 49.0“的一种方法
- 用log4j在日志文件里打印异常
- 工厂模式与三层架构这两个概念之间的联系和区别?
- 两下搞定Linux下Oracle的自启动
- STL中sort的用法举例
- Android的Hello World
- struts2指定欢迎页面为action请求