c++ 标准库类型string
標(biāo)準(zhǔn)庫類型string
string表示可變長的字符序列,使用string類型必須首先包含string頭文件。
文章目錄
- 一、定義和初始化string對象
- 二、操作string對象
- 三、處理string對象中的字符
一、定義和初始化string對象
如何初始化類的對象是由類本身決定的。
1.拷貝初始化:
使用=初始化一個(gè)變量,編譯器把等號(hào)右側(cè)的初始值拷貝到新創(chuàng)建的對象中去。
2.直接初始化:不使用=
string s1;//s1是一個(gè)空串,該string對象中沒有任何字符。 string s2(s1); string s2 = s1; string s3("value"); string s3 = "value";//這個(gè)字符串字面值,除了最后那個(gè)空字符以外,全部被拷貝到新建的s3對象中去。 string s4(n,'c');//string s4(6,'c');把s4初始化成,連續(xù)6個(gè)字符c組成的串。二、操作string對象
類除了規(guī)定初始化其對象,還能夠定義對象上能執(zhí)行的方法。
類既可以通過函數(shù)名調(diào)用方法,也可以定義<<、+等各種運(yùn)算符在該類對象上的新含義。
1.讀寫 string 對象
在使用cin執(zhí)行讀取操作時(shí),string對象會(huì)忽略開頭空白,從第一個(gè)字符開始,到下一個(gè)空白結(jié)束。
#include<iostream> #include<string> using namespace std; int main(){string s;cin>>s;cout<<s<<endl;return 0; } //輸入: hello world //輸出:hello2.讀取未知數(shù)量的 string 對象
string word; while(cin >> word)//沒遇到文件結(jié)束標(biāo)記或者非法輸入,一直讀取cout << word << endl;3.使用 getline 讀取一整行
如果說在最終字符串中保留輸入時(shí)的空白,使用getline函數(shù)替代>>。
函數(shù)從給定的輸入流中讀取數(shù)據(jù),直到遇到換行符為止(換行符也被讀進(jìn)來了),然后把所讀的內(nèi)容存放在string對象里(這里面不存在換行符)。
如果輸入一開始就是個(gè)換行符,那么所得結(jié)果是一個(gè)空string。
string line; getline(cin, line); cout << line << endl; //getline返回它的流參數(shù),我們也能把getline的結(jié)果作為條件。 while(getline(cin, line))//每次讀一整行,直到文件末尾。cout << line << endl;4.string 的 empty 和 size 操作:
empty是string的一個(gè)成員函數(shù),使用點(diǎn)操作符指明是那個(gè)對象執(zhí)行了 empty 函數(shù)即可。
s.empty()s為空返回true,否則返回false。
while (getline(cin, line))//只輸出非空的行if(!line.empty())//如果line不為空則返回真。cout << line << endl;size函數(shù)返回string對象的長度(字符的個(gè)數(shù))。
while (getline(cin, line))//只輸出超過80個(gè)字符的行if(line.size() > 80)cout << line << endl;size函數(shù)返回的是string::size_type類型的值,它是一個(gè)無符號(hào)類型的值,而且能夠存放下任何string對象的大小。
string s; cin>>s; auto len = s.size();//c++11允許通過auto來推斷變量類型 cout << len;5.字符串字面值和string是不同的類型。
使用+運(yùn)算符,必須確保每個(gè)+的兩側(cè)的運(yùn)算對象至少有一個(gè)是string。
//字面值和string對象相加: string s4 = s1 + ",";//正確 string s5 = "hello" + ",";//錯(cuò)誤 string s6 = (s1 + ",") + "world";//正確,對string對象使用+運(yùn)算符得到一個(gè)新的string對象。三、處理string對象中的字符
1.使用 范圍for(range for)語句處理每個(gè)字符
范圍for語句:遍歷給定序列中的每個(gè)元素并對序列中的每個(gè)值執(zhí)行某種操作。
//語法形式: for (declaration : experssion)statement /* experssion: 一個(gè)對象,用于表示一個(gè)序列。 declaration: 定義一個(gè)變量,該變量用于訪問序列中的基礎(chǔ)元素。 statement: 對每個(gè)元素的操作。 */ string str("some words"); for (auto c : str)//對于str中的每一個(gè)字符。每次迭代,str的下一個(gè)字符被拷貝給c。cout << c << endl;//輸出當(dāng)前字符并加一個(gè)換行符。改變某個(gè)字符的特性,利用cctype頭文件中的函數(shù),進(jìn)行相應(yīng)判斷:
isdigit(c);//c是數(shù)字時(shí)為真。 isalpha(c);//c是字母時(shí)為真。 ispunct(c);//c是標(biāo)點(diǎn)符號(hào)時(shí)為真,即c不是控制字符、數(shù)字、字母、可打印空白中的一種。 toupper(c);//如果c是小寫字母,輸出對應(yīng)的大寫字母,否則原樣輸出c。 ... //還有很多,請查手冊。 string s("HELLO WORLD!!!"); decltype(s.size()) punct_cnt = 0;//punct_cnt類型和s.size類型相同。 for (auto c : s)if (ispunct(c))//對于s中每個(gè)字符,如果該字符是標(biāo)點(diǎn)符號(hào),將標(biāo)點(diǎn)符號(hào)計(jì)數(shù)值加一。++punct_cnt; cout << punct_cnt<< " punctuation characters in " << s << endl;2.使用 范圍for 語句改變字符串中的字符
把循環(huán)變量定義成引用類型即可,使用引用作為循環(huán)控制變量時(shí),這個(gè)變量被依次綁定到了序列的每個(gè)元素上。
string s("Hello World!!"); for(auto &c : s)c = toupper(c);//c是一個(gè)引用,因此賦值語句將改變s中字符的值。 cout << s << endl;//輸出:HELLO WORLD3.只處理一部分字符
訪問string 對象的單個(gè)字符有兩種方式,一種是用下標(biāo),另一種是用迭代器。這里先介紹通過下標(biāo)的方法。
- string對象的下標(biāo)必須>=0 而且 <s.size()。
- 如果下標(biāo)是帶符號(hào)類型的值,將自動(dòng)轉(zhuǎn)換成由 string::size_type 表達(dá)的無符號(hào)類型。
- 下標(biāo)運(yùn)算符[]接收的輸入?yún)?shù)是 string::size_type 類型的值,這個(gè)參數(shù)表示要訪問的字符的位置,返回值是該位置上字符的引用。
- 不管什么時(shí)候只要對string對象使用了下標(biāo),都要確認(rèn)在那個(gè)位置上確實(shí)有值。
4.使用下標(biāo)執(zhí)行迭代:
for (decltype(s.size()) index = 0;index !=s.size() && != isspace(s[index]); ++index)s[index] = toupper(s[index]); //依次處理s中的字符,直至我們處理完全部字符或者遇到一個(gè)空白 //如果s是some thing,經(jīng)過操作,s變成SOME thing這里使用了:index !=s.size() && != isspace(s[index])
c++語言規(guī)定,只有左側(cè)運(yùn)算對象為真,才會(huì)檢查右側(cè)運(yùn)算對象。因此只有在index達(dá)到s.size()之前,才會(huì)執(zhí)行s[index],這樣確保index比s.size()小。
總結(jié)
以上是生活随笔為你收集整理的c++ 标准库类型string的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 启动 x,(1)linux启
- 下一篇: s3c2440移植MQTT