string::c_str的介绍:

c_str函数的返回值是const char*的,不能直接赋值给char*,所以就需要我们进行相应的操作转化,下面就是这一转化过程。

c++语言提供了两种字符串实现,其中较原始的一种只是字符串的c语言实现。与C语言的其他部分一样,它在c++的所有实现中可用,我们将这种实现提供的字符串对象,归为c-串,每个c-串char*类型的。

标准头文件包含操作c-串的函数库。这些库函数表达了我们希望使用的几乎每种字符串操作。 当调用库函数,客户程序提供的是string类型参数,而库函数内部实现用的是c-串,因此需要将string对象,转化为char*对象,而c_str()提供了这样一种方法,它返回一个客户程序可读不可改的指向字符数组的指针。 例:

#include

#include

usingnamespace std;

void main()

{

string add_to="hello!";

//std::cout<

const string add_on="baby";

const char*cfirst = add_to.c_str();

const char*csecond = add_on.c_str();

char*copy =newchar[strlen(cfirst) + strlen(csecond) +1];

strcpy( copy, cfirst);

std::cout<

//strcat( copy, csecond);

add_to = copy;

delete [] copy;

std::cout<

}

简单的例子:

const char *c_str();

c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同.

这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。

注意:一定要使用strcpy()函数 等来操作方法c_str()返回的指针

比如:最好不要这样:

char* c;

string s="1234";

c = s.c_str();    //c最后指向的内容是垃圾,因为s对象被析构,其内容被处理(纠正:s对象的析构是在对指针c完成赋值操作之后进行的,故此处并没有错误)

应该这样用:

char c[20];

string s="1234";

strcpy(c,s.c_str());

这样才不会出错,c_str()返回的是一个临时指针,不能对其进行操作

再举个例子

c_str() 以 char* 形式传回 string 内含字符串

如果一个函数要求char*参数,可以使用c_str()方法:

string s ="Hello World!";

printf("%s", s.c_str()); //输出 "Hello World!"

c_str在打开文件时的用处:当需要打开一个由用户自己输入文件名的文件时,可以这样写:ifstream in(st.c_str());。其中st是string类型,存放的即为用户输入的文件名。

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

补充:string是C++类,所以尽量用C++的函数操作string类。对应的是标准C和char *.

posted on 2012-02-24 19:04 SunnySophie 阅读(243) 评论(0)  编辑 收藏 引用 所属分类: C++开发

c 串转string_string::c_str()、string::c_data()及string与char *的正确转换相关推荐

  1. C++中有string类,string是一个类不是一种类型,c语言中没有

    前言: string 的角色 1 string 使用 1.1 充分使用string 操作符 1.2 眼花缭乱的string find 函数 1.3 string insert, replace, er ...

  2. CString,int,string,char*之间的转换

    <C++标准函数库>中说的   有三个函数可以将字符串的内容转换为字符数组和C-string   1.data(),返回没有"\0"的字符串数组   2,c_str() ...

  3. String str =new String(“abc“)和 String str = “abc“的比较

    String是一个非常常用的类,应该深入的去了解String 如: String str =new String("abc") String str1 = "abc&qu ...

  4. CString,string,char数组的转换

    虽然网上关于CString,string,char数组的转换的文章一大堆,但是感觉很乱很杂,而且许多并不能真正达到目的,在此,我把自己调试通过的转换方法贴到这里,做个笔记. 编译环境:vs2008, ...

  5. Java String indexOf(String substr,int fromIndex)方法,带示例

    字符串indexOf(String substr,int fromIndex)方法 (String indexOf(String substr, int fromIndex) Method) inde ...

  6. C++中string、char[]、char*之间的转换

    目录 1.char[].char*转string 2.string转char*.char[] 1.char[].char*转string char[].插入*转string比较简单,直接赋值即可进行转 ...

  7. 关于std::string和 C-style string的一些知识点备忘

    C++ 中的std::string和 C-style string 是两种不同的字符串,前者是标准库中定义的一个类,后者是字符数组的别名. C-style string:通常都以\0作为结尾. std ...

  8. C# 字符串拼接性能探索 c#中+、string.Concat、string.Format、StringBuilder.Append四种方式进行字符串拼接时的性能...

    本文通过ANTS Memory Profiler工具探索c#中+.string.Concat.string.Format.StringBuilder.Append四种方式进行字符串拼接时的性能. 本文 ...

  9. VC之CString,wchar_t,int,string,char*之间的转换

    VC之CString,wchar_t,int,string,char*之间的转换 1. CString 转 wchar_t CString path = "asdf"; wchar ...

最新文章

  1. 从Jenkins迁移到Jenkins X:一场持续交付之旅\n
  2. Python字符串的encode与decode
  3. centos(linux) 下如何查看端口占用情况及杀死进程
  4. 实践篇 | 推荐系统之矩阵分解模型
  5. redis的入门/原理/实战大总结
  6. Nobot控件------拒绝机器人行为
  7. c语言机考答案,全国计算机等级考试C语言上机试题题库(内附答案)
  8. c#利用zlib.net对文件进行deflate流压缩(和java程序压缩生成一样)
  9. 实现UniqueAttribute唯一性约束-优化版
  10. 实验3-1 求一元二次方程的根 (20 分)
  11. [转载] python while循环 打印菱形
  12. 对不起,又秀了一波恩爱!
  13. LINUX SHELL获得CPU核心(线程)个数
  14. php中字符串分割函数是,php分割字符串的函数是什么
  15. Gmail注册时手机号无法验证
  16. 人流量统计管理平台汇总显示方案_实现在场人数管控
  17. SprintBoot使用@Vaildated注解进行参数校验、全局异常处理以及注解校验不生效问题
  18. 《漫画算法》终于出电子书了!
  19. 自己用的unity学习笔记(一)——unity3d基础操作
  20. 为什么开发与测试老掐架呢

热门文章

  1. 积性函数与线性筛(还不会)
  2. 收集一些深度学习视频
  3. Collection View Programming Guide for iOS---(四)---Using the Flow Layout
  4. 基础知识收藏(ASP.NET的OnClientClick与OnClick事件)-2013.07.10
  5. cyico收集的关于utf8转换gb2312,以及关于javascript实现urlencode和urldecode的一些方法...
  6. newLisp使用初步
  7. generator (2)
  8. 【洛谷p1058】立体图(已完结)
  9. 微信小程序http转https
  10. jQuery基础 (一)—样式篇