# Python 及 C++ 遍歷字串 > 作者:王一哲 > 日期:2023年7月29日 ## 前言 由於我大約一年前開始寫 APCS、ZeroJudge 的題目,最近又開始寫 LeetCode,我會先用比較熟悉的 Python 解題,確定程式碼的邏輯正確後,再用 C++ 重寫一遍。在重寫的過程中,因為我對於 C++ 的語法不太熟悉,經常需要上網找資料,沒想到現在 C++ 多了很多方便的工具,甚至有些寫法跟 Python 很像。 **遍歷字串**是指依序讀取字串中的字元並做一些處理,例如將每個字元依照 ASCII 編碼加1,再儲存到另一個字串中,以下是 Python 及 C++ 的寫法。 <br /> ## Python 語法 ### 方法1:使用 for 迴圈及索引值 Python 中的字串類似由字元組成的陣列,索引值由 0 開始,可以用索引值取出字串中的內容。方法1是用 for 迴圈,將變數 i 的值依序由 0、1、2、... 代入,直到 **(字串長度 - 1)** 為止,再用 s\[i\] 就可以依序讀取字串中的字元。 ```python= s = "Hello World!" s2 = "" for i in range(len(s)): s2 += chr(ord(s[i])+1) print(s2) ``` ### 方法2:使用 for 迴圈並暫存字元 Python 的 for 迴圈有一種特別的用法,可以由 in 後方的物件依序取出元素,例如第3行,就是將字串 s 中的字元依序取出並暫存於變數 c,變數 c 在離開 for 迴圈時就會消失。 ```python= s = "Hello World!" s2 = "" for c in s: s2 += chr(ord(c)+1) print(s2) ``` 以上兩種寫法印出的字串 s2 內容皆為 **Ifmmp!Xpsme"**。 <br /> ## C++ 語法 ### 方法1:使用 for 迴圈及索引值 如果要在 C++ 中使用字串物件,需要先引入函式庫 **string**,變數的格式名稱就是 **string**。如果想要取得字串 s 的長度,可以用 **s.size()**,回傳值的格式為 **size_t**,是沒有正負號的整數。由於字串類似由字元組成的陣列,索引值由 0 開始,可以用索引值取出字串中的內容。方法1是用 for 迴圈,將變數 i 的值依序由 0、1、2、... 代入,若 i 小於字串長度繼續執行迴圈,再用 s\[i\] 就可以依序讀取字串中的字元。有一個需要注意之處,**變數 i 的格式要使用 size_t**,**不要使用 int**,否則編譯時可能會有警告或是編譯失敗。 ```cpp= #include <iostream> #include <string> using namespace std; int main() { string s = "Hello World!", s2 = ""; for(size_t i=0; i<s.size(); i++) { s2 += char(s[i]+1); } cout << s2 << endl; return 0; } ``` ### 方法2:使用 for 迴圈及迭代器 iterator C++ 標準樣版函式庫 (Standard Template Library, STL) 提供了迭代器 (iterator),如果要使用字串的迭代器可以寫成 **string::iterator**,甚至可以用**auto** 由後方的物件自動判斷迭代器的種類,由於迭代器的值是記憶體位置,如果要取出記憶體位置代表的內容需要在前面加上 **星號 \***,如果還要對這個值再做運算,要再加上 **括號 ()**,例如 **(\*it)**。 ```cpp= #include <iostream> #include <string> using namespace std; int main() { string s = "Hello World!", s2 = ""; for(string::iterator it = s.begin(); it != s.end(); it++) { //for(auto it = s.begin(); it != s.end(); it++) { s2 += char((*it)+1); } cout << s2 << endl; return 0; } ``` ### 方法3:使用 for 迴圈並暫存字元 這個方法很像 Python 的語法,**for(auto c : s)** 會將字串 s 的字元依序取出並存到變數 c。 ```cpp= #include <iostream> #include <string> using namespace std; int main() { string s = "Hello World!", s2 = ""; for(auto c : s) { s2 += char(c+1); } cout << s2 << endl; return 0; } ``` 以上三種寫法印出的字串 s2 內容皆為 **Ifmmp!Xpsme"**。 <br /> ## 結語 現在的 C++ 多了很多方便的工具,我之後會在寫一些筆記,才不會過幾個月沒碰就忘光了。 --- ###### tags:`C++`、`Python`