c++ 中 char 與 string 之間的相互轉換問題
第一部分:
將 char * 或者 char [] 轉換為 string
可以直接賦值,轉換。
第二部分:
將 string 轉換為 char * 或者 char []
string 是c++標準庫裡面其中一個,封裝了對字串的操作
把string轉換為char* 有 3種方法
1. 呼叫 string 的 data 函式
如:
string str="abc";
char *p=str.data();
2.呼叫 string 的 c_str 函式
如:string str="gdfd";
char *p=str.c_str();
3 呼叫 string 的 copy 函式
比如
string str="hello";
char p[40];
str.copy(p,5,0); //這裡5,代表複製幾個字元,0代表複製的位置
*(p+5)='/0'; //要手動加上結束符
cout < <p;
語法: 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物件被析構,其內容被處理 應該這樣用: 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!"
1、如果要將string轉換為char*,可以使用string提供的函式c_str() ,或是函式data(),data除了返回字串內容外,不附加結束符'\0',而c_str()返回一個以‘\0’結尾的字元陣列。 2、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物件被析構,其內容被處理 應該這樣用: 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!"
1、首先必須瞭解,string可以被看成是以字元為元素的一種容器。字元構成序列(字串)。有時候在字元序列中進行遍歷,標準的string類提供了STL容器介面。具有一些成員函式比如begin()、end(),迭代器可以根據他們進行定位。
注意,與char*不同的是,string不一定以NULL('\0')結束。string長度可以根據length()得到,string可以根據下標訪問。所以,不能將string直接賦值給char*。
2、string 轉換成 char *
如果要將string直接轉換成const char *型別。string有2個函式可以運用。
一個是.c_str(),一個是data成員函式。
例子如下:
string s1 = "abcdeg";
const char *k = s1.c_str();
const char *t = s1.data();
printf("%s%s",k,t);
cout<<k<<t<<endl;
如上,都可以輸出。內容是一樣的。但是隻能轉換成const char*,如果去掉const編譯不能通過。
那麼,如果要轉換成char*,可以用string的一個成員函式copy實現。
string s1 = "abcdefg";
char *data;
int len = s1.length();
data = (char *)malloc((len+1)*sizeof(char));
s1.copy(data,len,0);
printf("%s",data);
cout<<data;
3、char *轉換成string
可以直接賦值。
string s;
char *p = "adghrtyh";
s = p;
不過這個是會出現問題的。
有一種情況我要說明一下。當我們定義了一個string型別之後,用printf("%s",s1);輸出是會出問題的。這是因為“%s”要求後面的物件的首地址。但是string不是這樣的一個型別。所以肯定出錯。
用cout輸出是沒有問題的,若一定要printf輸出。那麼可以這樣:
printf("%s",s1.c_str())
備註:
string::c_str()、string::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!"的字串,如果不幸運,就會導致程式出現其他問題,總會有一些不可遇見的錯誤。總之不會是你預期的那個結果。
strcpy
C語言標準庫函式strcpy,把從src地址開始且含有'\0'結束符的字串複製 到 以dest開始的地址空間。
本部落格是博主個人學習時的一些記錄,不保證是為原創,個別文章加入了轉載的源地址還有個別文章是彙總網上多份資料所成,在這之中也必有疏漏未加標註者,如有侵權請與博主聯絡。