string中c_str(),data(),copy(p,n)函數(shù)的用法總結(jié)
標(biāo)準(zhǔn)庫(kù)的string類(lèi)提供了3個(gè)成員函數(shù)來(lái)從一個(gè)string得到c類(lèi)型的字符數(shù)組:c_str()、data()、copy(p,n)。
1. c_str():生成一個(gè)const char*指針,指向以空字符終止的數(shù)組。
注:
①這個(gè)數(shù)組的數(shù)據(jù)是臨時(shí)的,當(dāng)有一個(gè)改變這些數(shù)據(jù)的成員函數(shù)被調(diào)用后,其中的數(shù)據(jù)就會(huì)失效。因此要么現(xiàn)用先轉(zhuǎn)換,要么把它的數(shù)據(jù)復(fù)制到用戶(hù)自己可以管理的內(nèi)存中。注意??聪吕?BR>
const char* c;
string s="1234";
c = s.c_str();
cout<<c<<endl; //輸出:1234
s="abcd";
cout<<c<<endl; //輸出:abcd
上面如果繼續(xù)用c指針的話(huà),導(dǎo)致的錯(cuò)誤將是不可想象的。就如:1234變?yōu)閍bcd
其實(shí)上面的c = s.c_str(); 不是一個(gè)好習(xí)慣。既然c指針指向的內(nèi)容容易失效,我們就應(yīng)該按照上面的方法,那怎么把數(shù)據(jù)復(fù)制出來(lái)呢?這就要用到strcpy等函數(shù)(推薦)。
//const char* c; //①
//char* c; //②
//char c[20];
char* c=new char[20];
string s="1234";
//c = s.c_str();
strcpy(c,s.c_str());
cout<<c<<endl; //輸出:1234
s="abcd";
cout<<c<<endl; //輸出:1234
注意:不能再像上面一樣①所示了,const還怎么向里面寫(xiě)入值啊;也不能②所示,使用了未初始化的局部變量“c”,運(yùn)行會(huì)出錯(cuò)的 。
② c_str()返回一個(gè)客戶(hù)程序可讀不可改的指向字符數(shù)組的指針,不需要手動(dòng)釋放或刪除這個(gè)指針。
2. data():與c_str()類(lèi)似,但是返回的數(shù)組不以空字符終止。
3. copy(p,n,size_type _Off = 0):從string類(lèi)型對(duì)象中至多復(fù)制n個(gè)字符到字符指針p指向的空間中。默認(rèn)從首字符開(kāi)始,但是也可以指定,開(kāi)始的位置(記住從0開(kāi)始)。返回真正從對(duì)象中復(fù)制的字符。------用戶(hù)要確保p指向的空間足夠保存n個(gè)字符。
// basic_string_copy.cpp
// compile with: /EHsc /W3
#include <string>
#include <iostream>
int main( )
{
using namespace std;
string str1 ( "1234567890" );
basic_string <char>::iterator str_Iter;
char array1 [ 20 ] = { 0 };
char array2 [ 10 ] = { 0 };
basic_string <char>:: pointer array1Ptr = array1;
basic_string <char>:: value_type *array2Ptr = array2;
cout << "The original string str1 is: ";
for ( str_Iter = str1.begin( ); str_Iter != str1.end( ); str_Iter++ )
cout << *str_Iter;
cout << endl;
basic_string <char>:: size_type nArray1;
// Note: string::copy is potentially unsafe, consider
// using string::_Copy_s instead.
nArray1 = str1.copy ( array1Ptr , 12 ); // C4996
cout << "The number of copied characters in array1 is: "
<< nArray1 << endl;
cout << "The copied characters array1 is: " << array1Ptr << endl;
basic_string <char>:: size_type nArray2;
// Note: string::copy is potentially unsafe, consider
// using string::_Copy_s instead.
nArray2 = str1.copy ( array2Ptr , 5 , 6 ); // C4996
cout << "The number of copied characters in array2 is: "
<< nArray2 << endl;
cout << "The copied characters array2 is: " << array2Ptr << endl;
////注意一定要使array3有足夠的空間
//char array3[5]={0};
//basic_string<char>::pointer array3Ptr=array3;
//basic_string<char>::size_type nArray3;
//nArray3 = str1.copy(array3,9); //錯(cuò)誤?。。?!
//cout<<"The number of copied characters in array3 is: "
// <<nArray3<<endl;
//cout<<"The copied characters array3 is: "<<array3Ptr<<endl;
}
上面最后注釋掉的部分,雖然編譯沒(méi)有錯(cuò)誤,但是運(yùn)行時(shí)會(huì)產(chǎn)生錯(cuò)誤:Stack around the variable 'array3' was corrupted.
相關(guān)文章
C語(yǔ)言動(dòng)態(tài)內(nèi)存泄露常見(jiàn)問(wèn)題內(nèi)存分配改進(jìn)方法詳解
今天遇見(jiàn)了一道有意思的內(nèi)存泄露題目,特地分享給大家,相信屏幕前的你學(xué)習(xí)完一定有所收獲,預(yù)祝讀者學(xué)習(xí)愉快,多多進(jìn)步早日升職加薪2021-10-10
C語(yǔ)言實(shí)現(xiàn)txt數(shù)據(jù)讀入內(nèi)存/CPU緩存實(shí)例詳解
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)txt數(shù)據(jù)讀入內(nèi)存/CPU緩存實(shí)例詳解的相關(guān)資料,這里對(duì)實(shí)現(xiàn)該函數(shù)進(jìn)行了代碼實(shí)現(xiàn),需要的朋友可以參考下2017-01-01
使用Qt開(kāi)發(fā)實(shí)現(xiàn)字幕滾動(dòng)效果
我們經(jīng)常能夠在外面看到那種滾動(dòng)字幕,那么就拿qt來(lái)做一個(gè)吧,文章通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有有一定的參考價(jià)值,需要的朋友可以參考下2023-11-11
C語(yǔ)言關(guān)于時(shí)間復(fù)雜度詳解
大家好,本篇文章主要講的是C語(yǔ)言關(guān)于時(shí)間復(fù)雜度詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下,方便下次瀏覽2022-01-01
C語(yǔ)言實(shí)現(xiàn)循環(huán)隊(duì)列基本操作
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)循環(huán)隊(duì)列基本操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
如何將編譯過(guò)的C++庫(kù)迅速部署在Visual?Studio新項(xiàng)目中
本文介紹在Visual?Studio中,通過(guò)屬性表,使得一個(gè)新建解決方案中的項(xiàng)目可以快速配置已有解決方案的項(xiàng)目中各類(lèi)已編譯好的C++第三方庫(kù)的方法,感興趣的朋友跟隨小編一起看看吧2024-05-05
C語(yǔ)言實(shí)現(xiàn)消消樂(lè)小游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)消消樂(lè)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12

