c_str
c_str
目錄
標準頭文件<cstring>包含操作c-串的函數庫。這些庫函數表達了我們希望使用的幾乎每種字元串操作。當調用庫函數,客戶程序提供的是string類型參數,而庫函數內部實現用的是c-串,因此需要將string對象,轉化為char*對象,而c_str()提供了這樣一種方法,它返回const char*類型(可讀不可改)的指向字元數組的指針。例:
//#include
#include //使用頭文件string ,否則最後cout<<無法輸出 add_to
using namespace std;
int main()
{
string add_to = "hello!";
const string add_on = "baby";
const char *cfirst = add_to.c_str();
const char *csecond = add_on.c_str();
char *copy = new char[strlen(cfirst) + strlen(csecond) + 1];
strcpy(copy, cfirst);
strcat(copy, csecond);
add_to = copy;
cout << "copy: " << copy << endl;
delete [] copy;
cout << "add_to: " << add_to << endl;
return 0;
}
![result](https://i1.twwiki.net/cover/w200/md/1/md1a681cc2b68301b7e2472b6b2f6c21f.jpg)
result
函數聲明: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對象的析構是在s的生命周期結束時,例如函數的返回)
在vc++2010中提示的錯誤原因:
![vc++2010中提示的錯誤原因](https://i1.twwiki.net/cover/w200/ma/c/mac7d6320b3045fcb9844e2e0172784c6.jpg)
vc++2010中提示的錯誤原因
char c[20];
string s="1234";
strcpy(c,s.c_str());
這樣才不會出錯,c_str()返回的是一個臨時指針,不能對其進行操作
c_str()返回的是一個分配給const char*的地址,其內容已設定為不可變更,如果再把此地址賦給一個可以變更內容的char*變數,就會產生衝突,在2010中是不被允許的。但是如果放入函數調用,或者直接輸出,因為這些函數和輸出都是把字元串指針作為 const char*引用的,所以不會有問題。
例(2)
c_str() 以const 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類型,存放的即為用戶輸入的文件名。