日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c 串转string_string::c_str()、string::c_data()及string与char *的正确转换

發(fā)布時間:2025/4/5 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c 串转string_string::c_str()、string::c_data()及string与char *的正确转换 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

string::c_str的介紹:

c_str函數(shù)的返回值是const char*的,不能直接賦值給char*,所以就需要我們進(jìn)行相應(yīng)的操作轉(zhuǎn)化,下面就是這一轉(zhuǎn)化過程。

c++語言提供了兩種字符串實現(xiàn),其中較原始的一種只是字符串的c語言實現(xiàn)。與C語言的其他部分一樣,它在c++的所有實現(xiàn)中可用,我們將這種實現(xiàn)提供的字符串對象,歸為c-串,每個c-串char*類型的。

標(biāo)準(zhǔn)頭文件包含操作c-串的函數(shù)庫。這些庫函數(shù)表達(dá)了我們希望使用的幾乎每種字符串操作。 當(dāng)調(diào)用庫函數(shù),客戶程序提供的是string類型參數(shù),而庫函數(shù)內(nèi)部實現(xiàn)用的是c-串,因此需要將string對象,轉(zhuǎn)化為char*對象,而c_str()提供了這樣一種方法,它返回一個客戶程序可讀不可改的指向字符數(shù)組的指針。 例:

#include

#include

usingnamespace std;

void main()

{

string add_to="hello!";

//std::cout<

const string add_on="baby";

const char*cfirst = add_to.c_str();

const char*csecond = add_on.c_str();

char*copy =newchar[strlen(cfirst) + strlen(csecond) +1];

strcpy( copy, cfirst);

std::cout<

//strcat( copy, csecond);

add_to = copy;

delete [] copy;

std::cout<

}

簡單的例子:

const char *c_str();

c_str()函數(shù)返回一個指向正規(guī)C字符串的指針, 內(nèi)容與本string串相同.

這是為了與c語言兼容,在c語言中沒有string類型,故必須通過string類對象的成員函數(shù)c_str()把string 對象轉(zhuǎn)換成c中的字符串樣式。

注意:一定要使用strcpy()函數(shù) 等來操作方法c_str()返回的指針

比如:最好不要這樣:

char* c;

string s="1234";

c = s.c_str();    //c最后指向的內(nèi)容是垃圾,因為s對象被析構(gòu),其內(nèi)容被處理(糾正:s對象的析構(gòu)是在對指針c完成賦值操作之后進(jìn)行的,故此處并沒有錯誤)

應(yīng)該這樣用:

char c[20];

string s="1234";

strcpy(c,s.c_str());

這樣才不會出錯,c_str()返回的是一個臨時指針,不能對其進(jìn)行操作

再舉個例子

c_str() 以 char* 形式傳回 string 內(nèi)含字符串

如果一個函數(shù)要求char*參數(shù),可以使用c_str()方法:

string s ="Hello World!";

printf("%s", s.c_str()); //輸出 "Hello World!"

c_str在打開文件時的用處:當(dāng)需要打開一個由用戶自己輸入文件名的文件時,可以這樣寫:ifstream in(st.c_str());。其中st是string類型,存放的即為用戶輸入的文件名。

string::c_str()、string::c_data()的區(qū)別:

const value_type *c_str( ) const;

const value_type *data( ) const;

data只是返回原始數(shù)據(jù)序列,沒有保證會用traits::eos(),或者說'\0'來作字符串結(jié)束.?? 當(dāng)然,可能多數(shù)實現(xiàn)都這樣做了。

c_str是標(biāo)準(zhǔn)的做法,返回的char*, 一定指向一個合法的用'\0'終止的C兼容的字符串。

所以,如果需要C兼容的字符串,c_str是標(biāo)準(zhǔn)的做法,data并不保證所有STL的實現(xiàn)的一致性。

你或許會問,c_str()的功能包含data(),那還需要data()函數(shù)干什么?看看源碼:

const charT* c_str () const

{

if? (length () == 0)

return "";

terminate ();

return data ();

}

原來c_str()的流程是:先調(diào)用terminate(),然后在返回data()。因此如果你對效率要求比較高,而且你的處理又不一定需要以\0的方式結(jié)束,你最好選擇data()。但是對于一般的C函數(shù)中,需要以const char*為輸入?yún)?shù),你就要使用c_str()函數(shù)。

對于c_str() data()函數(shù),返回的數(shù)組都是由string本身擁有,千萬不可修改其內(nèi)容。其原因是許多string實現(xiàn)的時候采用了引用機(jī)制,也就是說,有可能幾個string使用同一個字符存儲空間。而且你不能使用sizeof(string)來查看其大小。詳細(xì)的解釋和實現(xiàn)查看Effective STL的條款15:小心string實現(xiàn)的多樣性。

另外在你的程序中,只在需要時才使用c_str()或者data()得到字符串,每調(diào)用一次,下次再使用就會失效,如:

string strinfo("this is Winter");

...

//最好的方式是:

foo(strinfo.c_str());

//也可以這么用:

const char* pstr=strinfo.c_str();

foo(pstr);

//不要再使用了pstr了, 下面的操作已經(jīng)使pstr無效了。

strinfo += " Hello!";

foo(pstr);//錯誤!

會遇到什么錯誤?當(dāng)你幸運(yùn)的時候pstr可能只是指向"this is Winter Hello!"的字符串,如果不幸運(yùn),就會導(dǎo)致程序出現(xiàn)其他問題,總會有一些不可遇見的錯誤。總之不會是你預(yù)期的那個結(jié)果。

補(bǔ)充:string是C++類,所以盡量用C++的函數(shù)操作string類。對應(yīng)的是標(biāo)準(zhǔn)C和char *.

posted on 2012-02-24 19:04 SunnySophie 閱讀(243) 評論(0) ?編輯?收藏 引用 所屬分類: C++開發(fā)

總結(jié)

以上是生活随笔為你收集整理的c 串转string_string::c_str()、string::c_data()及string与char *的正确转换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。