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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++string详解

發(fā)布時間:2024/2/28 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++string详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
之所以拋棄char*的字符串而選用 C++ 標(biāo)準(zhǔn)程序庫中的 string 類,是因?yàn)樗颓罢弑容^起來,不必?fù)?dān)心內(nèi)存是否足夠、字符串長度等等,而且作為一個類出現(xiàn),他集成的操作函數(shù)足以完成我們大多數(shù)情況下(甚至是100%)的需要。我們可以用 = 進(jìn)行賦值操作,== 進(jìn)行比較,+ 做串聯(lián)(是不是很簡單?)。我們盡可以把它看成是 C++ 的基本數(shù)據(jù)類型。?
??? 好了,進(jìn)入正題………?
首先,為了在我們的程序中使用 string 類型,我們必須包含頭文件 。如下:?
??? #include //注意這里不是 string .h? string .h是C字符串頭文件?

1.聲明一個 C++ 字符串?
聲明一個字符串變量很簡單:?
??? string ?Str;?
這樣我們就聲明了一個字符串變量,但既然是一個類,就有構(gòu)造函數(shù)和析構(gòu)函數(shù)。上面的聲明沒有傳入?yún)?shù),所以就直接使用了 string 的默認(rèn)的構(gòu)造函數(shù),這個函數(shù)所作的就是把Str初始化為一個空字符串。 String 類的構(gòu)造函數(shù)和析構(gòu)函數(shù)如下:?
a)???? string ?s;?? //生成一個空字符串s?
b)???? string ?s(str) //拷貝構(gòu)造函數(shù) 生成str的復(fù)制品?
c)???? string ?s(str,stridx) //將字符串str內(nèi)“始于位置stridx”的部分當(dāng)作字符串的初值?
d)???? string ?s(str,stridx,strlen) //將字符串str內(nèi)“始于stridx且長度頂多strlen”的部分作為字符串的初值?
e)???? string ?s(cstr) //將C字符串作為s的初值?
f)???? string ?s(chars,chars_len) //將C字符串前chars_len個字符作為字符串s的初值。?
g)???? string ?s(num,c) //生成一個字符串,包含num個c字符?
h)???? string ?s(beg,end) //以區(qū)間beg;end(不包含end)內(nèi)的字符作為字符串s的初值?
i)???? s.~ string () //銷毀所有字符,釋放內(nèi)存?
都很簡單,我就不解釋了。?
2.字符串操作函數(shù)?
??? 這里是 C++ 字符串的重點(diǎn),我先把各種操作函數(shù)羅列出來,不喜歡把所有函數(shù)都看完的人可以在這里找自己喜歡的函數(shù),再到后面看他的詳細(xì)解釋。?
a) =,assign()??? //賦以新值?
b) swap()??? //交換兩個字符串的內(nèi)容?
c) +=,append(),push_back() //在尾部添加字符?
d) insert() //插入字符?
e) erase() //刪除字符?
f) clear() //刪除全部字符?
g) replace() //替換字符?
h) + //串聯(lián)字符串?
i) ==,!=,<,<=,>,>=,compare()?? //比較字符串?
j) size(),length()?? //返回字符數(shù)量?
k) max_size() //返回字符的可能最大個數(shù)?
l) empty()?? //判斷字符串是否為空?
m) capacity() //返回重新分配之前的字符容量?
n) reserve() //保留一定量內(nèi)存以容納一定數(shù)量的字符?
o) [ ], at() //存取單一字符?
p) >>,getline() //從stream讀取某值?
q) <<?? //將謀值寫入stream?
r) copy() //將某值賦值為一個C_ string ?
s) c_str() //將內(nèi)容以C_ string 返回?
t) data() //將內(nèi)容以字符數(shù)組形式返回?
u) substr() //返回某個子字符串?
v)查找函數(shù)?
w)begin() end() //提供類似STL的迭代器支持?
x) rbegin() rend() //逆向迭代器?
y) get_allocator() //返回配置器?
下面詳細(xì)介紹:?
2.1? C++ 字符串和C字符串的轉(zhuǎn)換?

???C++提供的由C++字符串得到對應(yīng)的C_string的方法是使用data()、c_str()和copy(),其中,data()以字符數(shù)組的形式返回字符串內(nèi)容,但并不添加’\0’。c_str()返回一個以‘\0’結(jié)尾的字符數(shù)組,而copy()則把字符串的內(nèi)容復(fù)制或?qū)懭爰扔械腸_string或字符數(shù)組內(nèi)。C++字符串并不以’\0’結(jié)尾。我的建議是在程序中能使用C++字符串就使用,除非萬不得已不選用c_string。由于只是簡單介紹,詳細(xì)介紹掠過,誰想進(jìn)一步了解使用中的注意事項(xiàng)可以給我留言(到我的收件箱)。我詳細(xì)解釋。?


舉例:

#include<string>
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
? ? string s;
? ? cin>>s;
? ? /*
? ? char *str;
? ? str=(char *)s.c_str();
? ? puts(str);*/
? ? for(int i=0;i<s.size();i++) printf("%c",s[i]);
}

測試過了,讀者自己嘗試下

2.2 大小和容量函數(shù)?
??? 一個 C++ 字符串存在三種大小:a)現(xiàn)有的字符數(shù),函數(shù)是size()和length(),他們等效。Empty()用來檢查字符串是否為空。b)max_size() 這個大小是指當(dāng)前 C++ 字符串最多能包含的字符數(shù),很可能和機(jī)器本身的限制或者字符串所在位置連續(xù)內(nèi)存的大小有關(guān)系。我們一般情況下不用關(guān)心他,應(yīng)該大小足夠我們用的。但是不夠用的話,會拋出length_error異常c)capacity()重新分配內(nèi)存之前? string 所能包含的最大字符數(shù)。這里另一個需要指出的是reserve()函數(shù),這個函數(shù)為 string 重新分配內(nèi)存。重新分配的大小由其參數(shù)決定,默認(rèn)參數(shù)為0,這時候會對 string 進(jìn)行非強(qiáng)制性縮減。


還有必要再重復(fù)一下 C++字 符串和C字符串轉(zhuǎn)換的問題,許多人會遇到這樣的問題,自己做的程序要調(diào)用別人的函數(shù)、類什么的(比如數(shù)據(jù)庫連接函數(shù) Connect(char*,char*)),但別人的函數(shù)參數(shù)用的是char*形式的,而我們知道,c_str()、data()返回的字符數(shù)組由該字 符串擁有,所以是一種const char*,要想作為上面提及的函數(shù)的參數(shù),還必須拷貝到一個char*,而我們的原則是能不使用C字符串就不使用。那 么,這時候我們的處理方式是:如果此函數(shù)對參數(shù)(也就是char*)的內(nèi)容不修改的話,我們可以這樣 Connect((char*)UserID.c_str(), (char*)PassWD.c_str()),但是這時候是存在危險的,因?yàn)檫@樣轉(zhuǎn)換 后的字符串其實(shí)是可以修改的(有興趣地可以自己試一試),所以我強(qiáng)調(diào)除非函數(shù)調(diào)用的時候不對參數(shù)進(jìn)行修改,否則必須拷貝到一個char*上去。當(dāng)然,更穩(wěn) 妥的辦法是無論什么情況都拷貝到一個char*上去。同時我們也祈禱現(xiàn)在仍然使用C字符串進(jìn)行編程的高手們(說他們是高手一點(diǎn)兒也不為過,也許在我們還穿 開襠褲的時候他們就開始編程了,哈哈…)寫的函數(shù)都比較規(guī)范,那樣我們就不必進(jìn)行強(qiáng)制轉(zhuǎn)換了。?

2.3元素存取?
??? 我們可以使用下標(biāo)操作符[]和函數(shù)at()對元素包含的字符進(jìn)行訪問。但是應(yīng)該注意的是操作符[]并不檢查索引是否有效(有效索引 0~str.length()),如果索引失效,會引起未定義的行為。而at()會檢查,如果使用at()的時候索引無效,會拋出 out_of_range異常。?
??? 有一個例外不得不說,const? string?a;的操作符[]對索引值是a.length()仍然有效,其返回值是’\0’。其他的各種情況,a.length()索引都是無效的。舉例如下:?
const? string?Cstr(“const? string”);?
string?Str(“ string”);?

Str[3];???? //ok?
Str.at(3);?? //ok?

Str[100]; //未定義的行為?
Str.at(100);?? //throw out_of_range?

Str[Str.length()]?? //未定義行為?
Cstr[Cstr.length()] //返回 ‘\0’?
Str.at(Str.length());//throw out_of_range?
Cstr.at(Cstr.length()) throw out_of_range?

我不贊成類似于下面的引用或指針賦值:?
char& r=s[2];?
char* p= &s[3];?
因?yàn)橐坏┌l(fā)生重新分配,r,p立即失效。避免的方法就是不使用。?

2.4比較函數(shù)?
??? C++字符串支持常見的比較操作符(>,>=,<,<=,==,!=),甚至支持 string與C- string的 比較(如 str<”hello”)。在使用>,>=,<,<=這些操作符的時候是根據(jù)“當(dāng)前字符特性”將字符按字典順序 進(jìn)行逐一得比較。字典排序靠前的字符小,比較的順序是從前向后比較,遇到不相等的字符就按這個位置上的兩個字符的比較結(jié)果確定兩個字符串的大小。同時, string(“aaaa”)???? 另一個功能強(qiáng)大的比較函數(shù)是成員函數(shù)compare()。他支持多參數(shù)處理,支持用索引值和長度定位子串來進(jìn)行比較。他返回一個整數(shù)來表示比較結(jié)果,返回值意義如下:0-相等 〉0-大于 <0-小于。舉例如下:?
??? string?s(“abcd”);?
????
??? s.compare(“abcd”); //返回0?
??? s.compare(“dcba”); //返回一個小于0的值?
??? s.compare(“ab”); //返回大于0的值?
????
s.compare(s); //相等?
??? s.compare(0,2,s,2,2); //用”ab”和”cd”進(jìn)行比較 小于零?
??? s.compare(1,2,”bcx”,2); //用”bc”和”bc”比較。?
怎么樣?功能夠全的吧!什么?還不能滿足你的胃口?好吧,那等著,后面有更個性化的比較算法。先給個提示,使用的是STL的比較算法。什么?對STL一竅不通?靠,你重修吧!?

2.5 更改內(nèi)容?
這在字符串的操作中占了很大一部分。?
首先講賦值,第一個賦值方法當(dāng)然是使用操作符=,新值可以是 string(如:s=ns) 、c_ string(如:s=”gaint”)甚至單一字符(如:s=’j’)。還可以使用成員函數(shù)assign(),這個成員函數(shù)可以使你更靈活的對字符串賦值。還是舉例說明吧:?
s.assign(str); //不說?
s.assign(str,1,3);//如果str是”iamangel” 就是把”ama”賦給字符串?
s.assign(str,2, string::npos);//把字符串str從索引值2開始到結(jié)尾賦給s?
s.assign(“gaint”); //不說?
s.assign(“nico”,5);//把’n’ ‘I’ ‘c’ ‘o’ ‘\0’賦給字符串?
s.assign(5,’x’);//把五個x賦給字符串?
把字符串清空的方法有三個:s=””;s.clear();s.erase();(我越來越覺得舉例比說話讓別人容易懂!)。?
string提供了很多函數(shù)用于插入(insert)、刪除(erase)、替換(replace)、增加字符。?
先說增加字符(這里說的增加是在尾巴上),函數(shù)有 +=、append()、push_back()。舉例如下:?
s+=str;//加個字符串?
s+=”my name is jiayp”;//加個C字符串?
s+=’a’;//加個字符?

s.append(str);?
s.append(str,1,3);//不解釋了 同前面的函數(shù)參數(shù)assign的解釋?
s.append(str,2, string::npos)//不解釋了?

s.append(“my name is jiayp”);?
s.append(“nico”,5);?
s.append(5,’x’); 超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生

總結(jié)

以上是生活随笔為你收集整理的C++string详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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