標準庫類型string
- 標準庫類型string表示可變長的字符序列,使用#include<string>引入頭文件,string定義在命名空間std中。
定義和初始化string對象
- 如何初始化類的對象是由類的本身決定的,類可以定義很多初始化對象的方式,但是這些方式之間必須有所不同,不同體現在初始值的數量、類型。
- 常用的初始化的例子
string s1; //空字符串
string s2(s1); //將s1作為s2的初始值
string s2 = s1; //和上面的一致string s3("Value"); //給s3賦value值
string s3 = "value"; //和上面一致string s4(n,'c'); //s4 = n個c
直接初始化和拷貝初始化
- = 拷貝初始化,將等號右側的初始值拷貝到新創建的對象中去
- 不使用等號,則執行的是直接初始化
string對象上的操作
- 一個類除了要規定初始化其對象的方式外,還要定義對象上所能執行的操作。
- 類既可以定義通過函數名字調用的操作,還可以定義<<、+等各種運算符在此類的對象上的新的含義。
- os<<s? ?將s寫到輸出流os中,返回s
- is>>s? ? 從is中讀取字符串賦值給s,字符串以空白分割,返回is
- getline(is,s)? 從is中讀取一行賦值給s,返回is
- s.empty() s為空返回true。否則返回false
- s.size()? ?返回s中的字符的個數
- s[n]? ? ? 返回s中第n個字符的引用,位置n從0開始計算
- s1+s2? 返回字符串s1和s2拼接的效果
- s1 = s2? 使用s2的副本代替s1中原來的字符
- s1 == s2? 如果s1和s2的字符完全一致,則他們相等
- s1 != s2
- <、<=、>、>=? 按照字典順序比較大小,且大小寫比較敏感
讀寫string對象
- 讀取操作的時候,string對象會自動忽略開頭的空白(空格符、換行符、指標符),并從第一個真正的字符開始讀起,直到遇見下一處的空白為止。例如輸入“? ? ?Hello? ? ? ?”,接收的卻是“Hello”,輸出的結果中沒有空格。
- 多個輸入或者輸出可以連寫在一起。
讀寫未知數量的string對象
int main(int argc,char **argv){string word;while(cin >> word){cout << word << endl;}return 0;
}
使用getline讀取一行
- 保留輸入的時候的空白符號,使用getline()替代先前的>>運算符號
- getline只要一遇到換行符號就會結束讀取操作并且返回結果,即使一開始輸入的就是換行符號,那么返回的就是空字符串。
int main(int argc,char **argv){string word;while(getline(cin,word)){cout << word << endl;}return 0;
}
string的size操作
- size函數返回的是一個string::size_type類型的值,這是一個無符號類型的數值,而且可以存放下任何string對象的大小。在C++11中允許使用auto或者decltype來判斷變量的類型。
- 如果表達式已經有了size()函數既不要使用int了,可以避免混用int和unsigned可能帶來的問題。
比較string對象
- ==和!=分別校驗兩個對象相等還是不相等。相等是指兩個對象的長度和所蘊含的字符完全一致。
- < <= >= > 和先前的認知是一致的,比較區分大小寫,按照字典序來比
- 如果兩個字符一短一長,短的所有位數和長的先前位數是一致的,那么小的小于長的
- 如果在某些位置上面元素不一致,以第一對相異字符比較結果作為整體比較結果。
兩個string對象相加
- 這個 + 符號和Java是一樣的,默認是字符串的拼接
- 如果將string對象、字符字面值和字符串字面值混在一起使用,需要保障每一個加法運算符 + 的兩側的運算符對象至少有一個是string。
string s1 = "Hello";string s2 = "World";string s3 = s1 + "," + s2 + '\n';string s4 = s1 + ",";string s5 = "Hello" + "\n";//錯誤,兩個運算對象都不是stringstring s6 = s1 + "," + "World";string s7 = "Hello " + "," + s2;//錯誤,不能把字面值直接相加
處理string對象中的字符
引入cctype頭文件就可以引入一些標準庫函數來處理字符
isalnum(c) | c是字母或者數字為真 |
isalpha(c) | c是字母為真 |
iscntrl(c) | c是控制字符為真 |
isdigit(c) | c是數字為真 |
isgraph(c) | c不是空格但是可以打印的時候為真 |
islower(c) | c是小寫字母為真 |
isprint(c) | c可打印為真(c是空格或者c具有可見的形式) |
ispunct(c) | c標點符號為真 |
isspace(c) | c空白為真 |
issupper(c) | c大寫字母為真 |
isxdigit(c) | c是十六進制為真 |
tolower(c) | 若c大寫,則轉化為小寫字母 |
toupper(c) | 若c小寫,則轉化為大寫字母 |
- C++在兼容C語言的庫,去掉.h,在頭文件的名字前面增加字母c即可。
使用for來處理每一個字符
- 將每一個字符改成小寫
int main(int argc,char **argv){string s = "HELLO WORLD!!!";for(auto &c : s) { //對于s中的每一個字符,其中&表示引用c = tolower(c); //c是一個引用,因此賦值語句將會改變c的數值}cout << s << endl;return 0;
}
- ?處理特定位置的字符:1,使用下標;2,使用迭代器
- 下標運算符號[] 接收的輸入值是string::size_type類型的數值,這個參數表示的是訪問字符的位置,返回的是該位置上字符的引用。字符對象的下標從0開始計算,最大的下標是s[s.size()-1]
補充知識
- decltype關鍵字用于查詢表達式的類型
- 詳細的參考鏈接地址?https://blog.csdn.net/caoshangpa/article/details/79129258
?
?
?