拜讀書會所賜,
近期閱讀C++ 17教學範本一書的第七章-字串的部分,
內容非常多,把常用的function都介紹過一輪,既然這麼完整的閱讀完這一章節,
那就把它紀錄下來,以便未來查閱。
預計會拆成好幾篇來說明。
系列文會介紹的主題如下:(紅色為本篇範圍)
- 定義字串
- 初始化字串
- 連結字串與數字
- 存取字串元素
- 比較字串
- 搜尋字串
- 修改字串
- string與vector
- stringstream
- 國際字元字串
- 原始字串字面值
書中特別強調一個概念:
"不要再使用舊式的C格式字串了!"
string類別能提供更有效和安全的機制去處理過去儲存在char陣列中的C格式字串。
使用前要做兩件事情:
- 必須 include <string>;
- 且string型態名稱是在std空間中定義,所以必須 using namespace std;
定義字串
- sting型態的物件包含空字元 ‘\0’ ,這是為了確保符合許多需求C格式字串的函數。
- 直接宣告string物件的話,沒給初始值即代表該字串沒有字元,長度為零。
那為什麼這邊要用length()與size()呢?
那是因為原本只有size()可以查詢字串長度,但大部分對於字串的認知是長度而不是大小,
因此才有後面的length()可以用來查詢字串長度,但兩者是一模一樣的功能哦!
附上MSDN的說明:
初始化字串
由於C++17都建議以新語法來撰寫程式碼,
所以這邊的初始化一樣是使用大括號初始器來給初值,
至於用大括號初始器有什麼好處,可以參考這篇 文章。
剛剛在測試字串長度時已經示範過如何使用大括號初始器了,
就是把字串放到大括號內而已,而且是不需要使用等號的。
但大括號初始器還有其他幾種用法:
- 大括號初始器的第二個參數,將會限制第一個參數的數量。
第二個參數為 5 ,那麼他就只會將字面值由左到右,
長度為5的字面值賦予給 part_literal ,因此只會輸出 Least。
雖然我不懂這可以用在哪,如果只要前五個字元,那何必給初始器這麼長的字面值呢...
當然也可以把字串字面值直接以字串取代,但效果就不同了,如下:
輸出結果為:
可以發現前面五個字元不見了,反而是從第六個字元開始輸出至結尾。
因此使用上要特別注意,字面值(literal)和字串是完全不一樣的東西哦!
使用小括號初始器
小括號也是能初始化字串的,但只能用單引號的字元來搭配。
輸出結果為:
重複輸出單引號字元。
那如果不小心把小括號輸出成大括號呢?
像這樣子:
是可以正常編譯的!
但結果會無法符合預期,如下:
利用其他string物件來初始化
直接拿既有的string物件來初始化當然也是可以的,
以下就將proverb設定給sentence。
輸出結果:
也可以類似大括號初始器一樣,指定string物件的範圍來初始化:
0 : 起始位置,2:擷取字元個數
輸出結果:
字串的初始化就告一段落啦!
沒有留言:
張貼留言