string::c_str()、string::data()的区别:

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!"的字符串,如果不幸运,就会导致程序出现其他问题,总会有一些不可遇见的错误。总之不会是你预期的那个结果。

strcpy

C语言标准库函数strcpy,把从src地址开始且含有'\0'结束符的字符串复制到  以dest开始的地址空间。

c 串转string_c++ 中 char 与 string 之间的相互转换问题相关推荐

  1. C#中char[]与string之间的转换

    C#中char[]与string之间的转换 原文:C#中char[]与string之间的转换 string 转换成 Char[] string ss = "abcdefg"; ch ...

  2. C# char[]与string之间的相互转换

    string 兑换 Char[] string ss = "abcdefg";char[] cc = ss.ToCharArray(); Char[] 转换成string stri ...

  3. C++ 中 char[],char *,string之间转换

    char []与char *之间转换 char []转char *:直接进行赋值即可 // char[] 转char * char str[] = "lala"; char *st ...

  4. char[],char *,string之间转换

    char []与char *之间转换 char []转char *:直接进行赋值即可 // char[] 转char * char str[] = "lala"; char *st ...

  5. python bytes转换为string_Python3 中 bytes 和 string 之间的互相转换

    Table of Contents Python3 最重要的新特性大概要算是对文本(text)和二进制数据(binary data)作了更为清晰的区分.文本总是 Unicode,由 str 类型表示. ...

  6. Java中List和数组Array和String之间的相互转换

    Java中List和数组Array和String之间的相互转换 之前面试的时候遇到一个问题,先给大家分享一下.问:我想分别得到list,string和数组的长度,我能通过什么代码来得到? 这个问题先留 ...

  7. C++中 char* 、string、 char、char[]在各种情况下的输入与输出

    之前在自己练手写代码的时候总是会在字符串,字符这一块卡住,今天写下这篇文章给自己长长记性! 其实在代码过程中会遇到很多很玄学的问题.刚刚在尝试的时候找到了之前写的测试字符串的程序,放到另外一个工程里跑 ...

  8. 【shiro】UsernamePasswordToken中char[]替代String的安全性

    shiro中UsernamePasswordToken类的源码中有一段注释很有意思. * <p>Note that this class stores a password as a ch ...

  9. C++中char*与wchar_t*之间的转换

    把char*转换为wchar_t* 用stdlib.h中的mbstowcs_s函数,可以通过下面的例子了解其用法: char *CStr = "string to convert" ...

最新文章

  1. 中国科学家将绘制最精细人脑三维“地图”
  2. 程序员面试题精选100题(20)-最长公共子串[算法]
  3. 马化腾内部讲座:让产品自己召唤人
  4. 【蓝桥杯Java_C组·从零开始卷】第三节(附)、for循环练习题(数据题与图形题)
  5. centos7 如何安装部署k8s_如何在centos7上安装FreeIPA的客户端
  6. Yum包管理工具的20个常用命令
  7. Acer 4750 安装黑苹果_安装黑苹果,你需要注意哪几点
  8. html信号动画,HTML5带音效的雷达检测信号动画
  9. ERROR streaming.StreamExecution: Query topic_lcc [id =xx, runId=xx] terminated with error
  10. 【安全】通过LAM(ldap-account-manager)来管理OpenLDAP
  11. Android开发笔记(一百三十二)矢量图形与矢量动画
  12. IIS 7 启用 gzip 静态压缩 压缩js和css文件
  13. matlab按图像边缘抠图_不会抠图?保姆级抠图教程!手把手教你抠图(二)
  14. HDU 5294 Tricks Device 最短路最小割 -
  15. 凯文.凯利:未来12个趋势(值得一读)
  16. vue中图片加载不出来的问题
  17. cad快看_星期日来啦!分享5个珍藏已久的电影网站,各种大片免费看
  18. 懂车帝:2018汽车行业大数据报告(附下载)
  19. 【CrackMe 实战】逆向破解实战之 001 Acid burn.exe
  20. Ubuntu桌面出现Accept clipboard from viewers,Send clipboard to viewers,Send primary selection to vi等三行错误时

热门文章

  1. python requests 示例_Python Requests模块的简单示例
  2. 计算约化重叠积分氟化氢HF
  3. java模态_java – 如何在另一个模态JDialog之上创建一个模态的JDialog
  4. 2.16 关于 Python Numpy 的说明-深度学习-Stanford吴恩达教授
  5. 类和对象—对象特性—深拷贝与浅拷贝
  6. 6.项目资源管理总结
  7. 【雷达书籍分享】RADAR SYSTEMS ANALYSIS AND DESIGN USING MATLAB
  8. 译:Spring Data Repository 不区分大小写查询
  9. 谷歌浏览器扩展开发笔记
  10. arcgis python 保存当前窗口图形为jpg