c 串转string_c++ 中 char 与 string 之间的相互转换问题
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 之间的相互转换问题相关推荐
- C#中char[]与string之间的转换
C#中char[]与string之间的转换 原文:C#中char[]与string之间的转换 string 转换成 Char[] string ss = "abcdefg"; ch ...
- C# char[]与string之间的相互转换
string 兑换 Char[] string ss = "abcdefg";char[] cc = ss.ToCharArray(); Char[] 转换成string stri ...
- C++ 中 char[],char *,string之间转换
char []与char *之间转换 char []转char *:直接进行赋值即可 // char[] 转char * char str[] = "lala"; char *st ...
- char[],char *,string之间转换
char []与char *之间转换 char []转char *:直接进行赋值即可 // char[] 转char * char str[] = "lala"; char *st ...
- python bytes转换为string_Python3 中 bytes 和 string 之间的互相转换
Table of Contents Python3 最重要的新特性大概要算是对文本(text)和二进制数据(binary data)作了更为清晰的区分.文本总是 Unicode,由 str 类型表示. ...
- Java中List和数组Array和String之间的相互转换
Java中List和数组Array和String之间的相互转换 之前面试的时候遇到一个问题,先给大家分享一下.问:我想分别得到list,string和数组的长度,我能通过什么代码来得到? 这个问题先留 ...
- C++中 char* 、string、 char、char[]在各种情况下的输入与输出
之前在自己练手写代码的时候总是会在字符串,字符这一块卡住,今天写下这篇文章给自己长长记性! 其实在代码过程中会遇到很多很玄学的问题.刚刚在尝试的时候找到了之前写的测试字符串的程序,放到另外一个工程里跑 ...
- 【shiro】UsernamePasswordToken中char[]替代String的安全性
shiro中UsernamePasswordToken类的源码中有一段注释很有意思. * <p>Note that this class stores a password as a ch ...
- C++中char*与wchar_t*之间的转换
把char*转换为wchar_t* 用stdlib.h中的mbstowcs_s函数,可以通过下面的例子了解其用法: char *CStr = "string to convert" ...
最新文章
- 中国科学家将绘制最精细人脑三维“地图”
- 程序员面试题精选100题(20)-最长公共子串[算法]
- 马化腾内部讲座:让产品自己召唤人
- 【蓝桥杯Java_C组·从零开始卷】第三节(附)、for循环练习题(数据题与图形题)
- centos7 如何安装部署k8s_如何在centos7上安装FreeIPA的客户端
- Yum包管理工具的20个常用命令
- Acer 4750 安装黑苹果_安装黑苹果,你需要注意哪几点
- html信号动画,HTML5带音效的雷达检测信号动画
- ERROR streaming.StreamExecution: Query topic_lcc [id =xx, runId=xx] terminated with error
- 【安全】通过LAM(ldap-account-manager)来管理OpenLDAP
- Android开发笔记(一百三十二)矢量图形与矢量动画
- IIS 7 启用 gzip 静态压缩 压缩js和css文件
- matlab按图像边缘抠图_不会抠图?保姆级抠图教程!手把手教你抠图(二)
- HDU 5294 Tricks Device 最短路最小割 -
- 凯文.凯利:未来12个趋势(值得一读)
- vue中图片加载不出来的问题
- cad快看_星期日来啦!分享5个珍藏已久的电影网站,各种大片免费看
- 懂车帝:2018汽车行业大数据报告(附下载)
- 【CrackMe 实战】逆向破解实战之 001 Acid burn.exe
- Ubuntu桌面出现Accept clipboard from viewers,Send clipboard to viewers,Send primary selection to vi等三行错误时
热门文章
- python requests 示例_Python Requests模块的简单示例
- 计算约化重叠积分氟化氢HF
- java模态_java – 如何在另一个模态JDialog之上创建一个模态的JDialog
- 2.16 关于 Python Numpy 的说明-深度学习-Stanford吴恩达教授
- 类和对象—对象特性—深拷贝与浅拷贝
- 6.项目资源管理总结
- 【雷达书籍分享】RADAR SYSTEMS ANALYSIS AND DESIGN USING MATLAB
- 译:Spring Data Repository 不区分大小写查询
- 谷歌浏览器扩展开发笔记
- arcgis python 保存当前窗口图形为jpg