string::c_str的介绍:
c_str函数的返回值是const char*的,不能直接赋值给char*,所以就需要我们进行相应的操作转化,下面就是这一转化过程。 c++语言提供了两种字符串实现,其中较原始的一种只是字符串的c语言实现。与C语言的其他部分一样,它在c++的所有实现中可用,我们将这种实现提供的字符串对象,归为c-串,每个c-串char*类型的。 标准头文件<cstring>包含操作c-串的函数库。这些库函数表达了我们希望使用的几乎每种字符串操作。 当调用库函数,客户程序提供的是string类型参数,而库函数内部实现用的是c-串,因此需要将string对象,转化为char*对象,而c_str()提供了这样一种方法,它返回一个客户程序可读不可改的指向字符数组的指针。 例:
1 #include <iostream> 2 #include <string> 3 usingnamespace std; 4 void main() 5 string add_to="hello!"; 6 //std::cout<<add_to<<endl; 7 conststring add_on="baby"; 8 constchar*cfirst = add_to.c_str(); 9 constchar*csecond = add_on.c_str(); 10 char*copy =newchar[strlen(cfirst) + strlen(csecond) +1]; 11 strcpy( copy, cfirst); 12 std::cout<<copy<<endl; 13 //strcat( copy, csecond); 14 add_to = copy; 15 delete [] copy; 16 std::cout<<add_to<<std::endl;
简单的例子: const char *c_str();
c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同. 这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。 注意:一定要使用strcpy()函数 等来操作方法c_str()返回的指针 比如:最好不要这样:
1 char* c; 2 string s="1234"; 3 c = s.c_str(); //c最后指向的内容是垃圾,因为s对象被析构,其内容被处理(纠正:s对象的析构是在对指针c完成赋值操作之后进行的,故此处并没有错误)
应该这样用:
1 char c[20]; 2 string s="1234"; 3 strcpy(c,s.c_str());
这样才不会出错,c_str()返回的是一个临时指针,不能对其进行操作 再举个例子 c_str() 以 char* 形式传回 string 内含字符串 如果一个函数要求char*参数,可以使用c_str()方法:
1 string s ="Hello World!"; 2 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 *.
【参考资料 感谢作者】 http://baike.baidu.com/view/1600698.htm http://www.cnblogs.com/lancidie/archive/2011/03/17/1987130.html
|
请发表评论