c 串转string_string::c_str()、string::c_data()及string与char *的正确转换
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 *的正确转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 均值极差图控制上下限_SPC之I-MR控
- 下一篇: mysql高可用_mysql高可用方案