tgirc早修book
使用 string 型態時,建議引入 <string> 標頭檔。
雖然現在不需要此標頭檔,也能宣告 string 及使用一些基本功能,不過一些功能還是要引入此標頭檔才能使用。
(嚴格來說 string 不算是一種型態,而是一種容器,不過現階段就先暫時先把它當成一種形態就好)
如果要看內容是否相同,直接用 ==
就好了,與 int
等型態操作方式相同。
至於 >
跟 <
也能用,不過比較順序是按照字典序來排列。
就像陣列一樣,可以直接以 str[n]
的方式處理,但存取超過陣列範圍的字元會出問題。
保險起見可以使用 .at(n)
,會有邊界檢查。如果超出範圍的話,雖然編譯時會給過,但執行時它會拋出一個 out_of_range
例外並終止程式。
輸出如下:
使用 .at()
的穩定性較高,但一般時候其實用 str[n]
就好了,效率會比較好。
使用 .size()
或是 .length()
兩者,在 string 上不會有明顯差異。
需要注意的是別忘了後面的括號 ()。
輸出如下:
可以使用 +
來串接兩字串,或是使用 .append(str)
來處理。
建議用 +
比較方便。
輸出如下:
使用 to_string(n)
則可以將 n 轉為字串型態。
反過來說,stoi(str)
可以將 str 字串的內容轉為 int,而因為型態變為 int,開頭的 0 就會消失了
輸出如下:
使用 .substr(x,n)
來取得 x 開始的 n 個字組成的子字串。
輸出如下:
使用 .insert(x,str)
在指定位置 x 插入 str。
取代則是用 .replace(x,n,str)
,把 x 開始的 n 個字元替換成 str。
刪除某段就用 .erase(x,n)
,把從 x 開始的 n 個字元刪掉。
切記,string 跟陣列一樣,第一個字元的位置是 0 而不是 1。
輸出如下:
使用 .find(str,n)
來尋找指定字串,回傳值為從n開始,找到的第一個str的開頭位置。
如果沒找到的話,則會回傳 string::npos。
輸出如下:
這個是搭配 reverse(a, b)
函式來使用的,比較特別的是 a 跟 b 要傳入的是位置。
如果要從 str 的開頭到結尾反轉,那 a 就是 str.begin()
,代表 str 開頭的位置,而 b 則是 str.end()
,代表 str 的結尾位置。
而如果是從第二個字元開始,那就把 a 換成 str.begin() + 1
。
如果只翻轉到倒數第二個,那就把 b 換成 str.end()-1
,簡而言之,往後一個就 +1,往前一個就 -1。
如果要使用 reverse()
,記得要引入 <algorithm> 標頭檔。
輸出如下:
一般使用 cin
輸入字串時,每遇到空格或換行,就會判斷為結束輸入。
但如果需要輸入一個文章,或是一段完整句子, cin
就無法完整輸入,因此會需要用到 getline
。
使用 getline()
輸入不會被空格截斷,每遇到換行會先接收換行的指令,再跳到下一個輸入
可以參考以下例子
範例 1
在這個例子中,我們輸入了 a 以後,還沒輸入字串程式就結束了
這是因為 cin 完最後的位子在 3 的後一格,所以 getline 讀到的是換行,而 getline 遇到換行會停下。
所以要輸入一段字串的話,要使用兩次 getline()
(或是 gets()
/getchar()
)。
第一個吃掉換行,第二格才是輸入你要輸入的字串