標籤:-- data- java div 標準 word size 實戰 遇見
在project中,我們也有非常多時候用到string與char*之間的轉換,這裡有個一我們之前提到的函數 c_str(),看看這個原型:
const char *c_str();
c_str()函數返回一個指向正規C字串的指標, 內容與本string串同樣.
這就看到了吧,傳回值是const char*,這裡須要注意一下。
1 string轉const char*
當然是用到上面所述的方法c_str():
string s1 = "abcdeg";const char *k = s1.c_str();cout<<k<endl;
還有還有一種方法:
data():與c_str()相似。可是返回的數組不以Null 字元終止。
2 string轉char*
能夠使用strcpy:
string s = "what fucking day";char* c;constint len = s.length();c =newchar[len+1];strcpy(c,s.c_str());
也能夠使用copy:
int main(){ std::string foo("quuuux"); char bar[7]; foo.copy(bar, sizeof bar); bar[6] = ‘\0‘; std::cout << bar << ‘\n‘;}
3 const char*轉string
4 char*轉string
簡單了:
char* c ="abc";string s(c);
================================================================
上面提到了data和c_str的差別,那麼到底差別在哪呢?
二者原型:
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!”的字串,假設不幸運。就會導致程式出現其它問題,總會有一些不可遇見的錯誤。
總之不會是你預期的那個結果。
實戰c++中的string系列--string與char*、const char *的轉換(data() or c_str())