2022年7月25日 星期一

[C++] 深入使用string字串 (part 1)

拜讀書會所賜,

近期閱讀C++ 17教學範本一書的第七章-字串的部分,

內容非常多,把常用的function都介紹過一輪,既然這麼完整的閱讀完這一章節,

那就把它紀錄下來,以便未來查閱。

預計會拆成好幾篇來說明。

系列文會介紹的主題如下:(紅色為本篇範圍)

  • 定義字串
  • 初始化字串
  • 連結字串與數字
  • 存取字串元素
  • 比較字串
  • 搜尋字串
  • 修改字串
  • string與vector
  • stringstream
  • 國際字元字串
  • 原始字串字面值
會從字串的初始化、操作,一直到延伸應用與相關的資訊。

書中特別強調一個概念:

"不要再使用舊式的C格式字串了!"

string類別能提供更有效和安全的機制去處理過去儲存在char陣列中的C格式字串。

使用前要做兩件事情:

  • 必須 include <string>;
  • 且string型態名稱是在std空間中定義,所以必須 using namespace std;

定義字串

  • sting型態的物件包含空字元 ‘\0’ ,這是為了確保符合許多需求C格式字串的函數。
  • 直接宣告string物件的話,沒給初始值即代表該字串沒有字元,長度為零。
以下示範沒給初始值以及給予初始值的字串長度:



可以看到即使給予初始值"Apple",字串長度依然是5,是不把空字元算入長度的。

那為什麼這邊要用length()與size()呢?

那是因為原本只有size()可以查詢字串長度,但大部分對於字串的認知是長度而不是大小,

因此才有後面的length()可以用來查詢字串長度,但兩者是一模一樣的功能哦!

附上MSDN的說明:


初始化字串

由於C++17都建議以新語法來撰寫程式碼,

所以這邊的初始化一樣是使用大括號初始器來給初值,

至於用大括號初始器有什麼好處,可以參考這篇 文章

剛剛在測試字串長度時已經示範過如何使用大括號初始器了,

就是把字串放到大括號內而已,而且是不需要使用等號的。

但大括號初始器還有其他幾種用法:

  • 大括號初始器的第二個參數,將會限制第一個參數的數量。

可以看到大括號初始器的第一個參數是字面值,

第二個參數為 5 ,那麼他就只會將字面值由左到右,

長度為5的字面值賦予給 part_literal ,因此只會輸出 Least。

雖然我不懂這可以用在哪,如果只要前五個字元,那何必給初始器這麼長的字面值呢...


當然也可以把字串字面值直接以字串取代,但效果就不同了,如下:

輸出結果為:

可以發現前面五個字元不見了,反而是從第六個字元開始輸出至結尾。

因此使用上要特別注意,字面值(literal)和字串是完全不一樣的東西哦!


使用小括號初始器

小括號也是能初始化字串的,但只能用單引號的字元來搭配。

輸出結果為:

重複輸出單引號字元。

那如果不小心把小括號輸出成大括號呢?

像這樣子:

是可以正常編譯的!

但結果會無法符合預期,如下:

利用其他string物件來初始化

直接拿既有的string物件來初始化當然也是可以的,

以下就將proverb設定給sentence。

輸出結果:

也可以類似大括號初始器一樣,指定string物件的範圍來初始化:

0 : 起始位置,2:擷取字元個數

輸出結果:


字串的初始化就告一段落啦!

下一篇 

沒有留言:

張貼留言

社會新鮮人如何投資?

我的觀點是,在 沒有很多 本錢 的情況下, 別寄望每個月幾千元放到股票或者最近很夯的高股息ETF就能讓你致富, 先投資自己,讓自己的本業收入提高吧。