就是把 string 轉成 char* string str="yoooo";char *a=str.c_str();ios
//---------------------------------------------------------------------------
#include <string>
#include <cstring>
using namespace std;
int main(void)
{
string a("abcde");
const char *cap=NULL;
char *b=NULL;
cap=a.c_str(); /*用法<1>*/
b=new char[a.size()+1];
strcpy(b,a.c_str()); /*用法<2>*/
return 0;
}
//---------------------------------------------------------------------------c++
string.c_str是Borland封裝的String類中的一個函數,它返回當前字符串的首字符地址。
c_str函數的返回值是constchar*的,不能直接賦值給char*,因此就須要咱們進行相應的操做轉化,下面就是這一轉化過程。c++語言提供了兩種字符串實現,其中較原始的一種只是字符串的c語言實現。與C語言的其餘部分同樣,它在c++的全部實現中可用,咱們將這種實現提供的字符串對象,歸爲c-串,每一個c-串char*類型的。
標準頭文件<cstring>包含操做c-串的函數庫。這些庫函數表達了咱們但願使用的幾乎每種字符串操做。 當調用庫函數,客戶程序提供的是string類型參數,而庫函數內部實現用的是c-串,所以須要將string對象,轉化爲char*對象,而c_str()提供了這樣一種方法,它返回const char*類型(可讀不可改)的指向字符數組的指針。 例:
#include <iostream>
#include <cstring>
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例(1)
函數聲明: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對象的析構是在對指針c完成賦值操做以後進行的,故此處並無錯誤)
在vc++2010中提示的錯誤緣由:
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類型,存放的即爲用戶輸入的文件名。數組
for(int i = 0; i != 2; ++i)
{
cout<<i<<" "; // 0
}函數