在工程中,我們也有很多時候用到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()類似,但是返回的數組不以空字符終止。**
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!”的字符串,如果不幸運,就會導致程序出現其他問題,總會有一些不可遇見的錯誤。總之不會是你預期的那個結果。
- 前言
- string與整型或浮點型互轉
- 指定浮點數有效數字并轉為string
- string的替換、查找(一些與路徑相關的操作)
- string的分割、替換(類似string.split或是explode())
- string的初始化、刪除、轉大小寫(construct erase upper-lower)
- string的遍歷(使用下標還是iterator)
- std::string與MFC中CString的轉換
- string到LPCWSTR的轉換
- std:vector&lt;char&gt; 和std:string相互轉換(vector to stringstream)
- CDuiString和string的轉換(duilib中的cduistring)
- string與char、const char 的轉換(data() or c_str())
- string的連接(+= or append or push_back)
- 函數返回局部變量string(引用局部string,局部string的.c_str()函數)
- 將string用于switch語句(c++做C#的事兒, switch中break還是return厲害)
- 不要使用memset初始化string(一定別這么干)