c 串转string_c++ 中 char 与 string 之间的相互转换问题
string::c_str()、string::data()的區(qū)別:
const value_type *c_str( ) const;
const value_type *data( ) const;
data只是返回原始數(shù)據(jù)序列,沒有保證會用traits::eos(),或者說'\0'來作字符串結(jié)束. ??當(dāng)然,可能多數(shù)實(shí)現(xiàn)都這樣做了。
c_str是標(biāo)準(zhǔn)的做法,返回的char*???一定指向一個合法的用'\0'終止的C兼容的字符串。
所以,如果需要C兼容的字符串,c_str ?是標(biāo)準(zhǔn)的做法,data ?并不保證所有STL的實(shí)現(xiàn)的一致性。
你或許會問,c_str()的功能包含data(),那還需要data()函數(shù)干什么?看看源碼:
const charT* c_str () const
{
if??(length () == 0)
return "";
terminate ();
return data ();
}
原來c_str()的流程是:先調(diào)用terminate(),然后在返回data()。因此如果你對效率要求比較高,而且你的處理又不一定需要以\0的方式結(jié)束,你最好選擇data()。但是對于一般的C函數(shù)中,需要以const char*為輸入?yún)?shù),你就要使用c_str()函數(shù)。
對于c_str() data()函數(shù),返回的數(shù)組都是由string本身擁有,千萬不可修改其內(nèi)容。其原因是許多string實(shí)現(xiàn)的時候采用了引用機(jī)制,也就是說,有可能幾個string使用同一個字符存儲空間。而且你不能使用sizeof(string)來查看其大小。詳細(xì)的解釋和實(shí)現(xiàn)查看Effective STL的條款15:小心string實(shí)現(xiàn)的多樣性。
另外在你的程序中,只在需要時才使用c_str()或者data()得到字符串,每調(diào)用一次,下次再使用就會失效,如:
string strinfo("this is Winter");
...
//最好的方式是:
foo(strinfo.c_str());
//也可以這么用:
const char* pstr=strinfo.c_str();
foo(pstr);
//不要再使用了pstr了, 下面的操作已經(jīng)使pstr無效了。
strinfo += " Hello!";
foo(pstr);//錯誤!
會遇到什么錯誤?當(dāng)你幸運(yùn)的時候pstr可能只是指向"this is Winter Hello!"的字符串,如果不幸運(yùn),就會導(dǎo)致程序出現(xiàn)其他問題,總會有一些不可遇見的錯誤。總之不會是你預(yù)期的那個結(jié)果。
strcpy
C語言標(biāo)準(zhǔn)庫函數(shù)strcpy,把從src地址開始且含有'\0'結(jié)束符的字符串復(fù)制到 ?以dest開始的地址空間。
總結(jié)
以上是生活随笔為你收集整理的c 串转string_c++ 中 char 与 string 之间的相互转换问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黄金一钱等于多少克
- 下一篇: mysql与配偶同性_mysql 左,右