實戰c++中的string系列--string與char*、const char *的轉換(data() or c_str())

來源:互聯網
上載者:User

標籤:--   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())

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.