# 【3-2】char & string 在學習運算子的時候,我們都是對數字進行運算;在學習一維陣列的時候,也是將數字儲存進去。 變數宣告的時候有學習過兩種文字的類別:`char` 和 `string` ## 宣告 ```cpp char c = 'a'; string s = "apple"; ``` 當然,也可以宣告成陣列: ```cpp char c[5]={'a','p','p','l','e'}; ``` 奇怪,怎麼沒有 `string` 的陣列? 答案是,`string` 其實就是 `char` 陣列,看個例子吧! ```cpp string s = "apple"; char c[5]={'a','p','p','l','e'}; ``` 陣列各格儲存的元素如下: | `s[0]` | `s[1]` | `s[2]` | `s[3]` | `s[4]` | | -------- | -------- | -------- | --- | --- | | a | p | p | l | e | | `c[0]` | `c[1]` | `c[2]` | `c[3]` | `c[4]` | | -------- | -------- | -------- | --- | --- | | a | p | p | l | e | ### Python對照 Python 中沒有 `char` 類別,每個字元其實就是長度為 1 的 `string`。宣告方式於[【1-1】變數宣告](https://hackmd.io/@LAfWxjSxRASps-4O_bppsA/H1PxDlSVeg)已演示過,這邊不多說明。 ## 運算 你有沒有想過,運算子如果用在 `string` 上會怎樣? ```cpp string s1 = "Hello"; string s2 = "World"; string s3 = s1 + " " + s2; ``` ```cpp s3 = "Hello World" ``` 沒錯,字串可以進行加法,其功能就是將字串接到前者的尾端。 但相減或者其他運算子都不行,會發生編譯錯誤。 你也可以對 `char` 進行相加,或者 `string` 跟 `char` 相加,應該會得到一些有趣的結果: ```cpp char c1 = 'A'; char c2 = 'P'; char c3 = 'C'; char c4 = 'S'; cout << c1+c2+c3+c4; ``` ### 輸出結果 ``` 295 ``` --- ```cpp string s = "APC"; char c = 'S'; cout << s+c; ``` ### 輸出結果 ``` APCS ``` --- ```cpp string s = "AP"; char c[2]={'C','S'}; cout << s+c[0]+c[1]; ``` ### 輸出結果 ``` APCS ``` --- ```cpp string s = "AP"; char c[2]={'C','S'}; cout << s[0]+s[1]+c[0]+c[1]; ``` ### 輸出結果 ``` 295 ``` 為什麼有時候能組成字串,有時候會跑出奇怪的數字呢?其實這源自於電腦對字符的編碼。 ## ASCII ASCII(美國標準信息交換碼,American Standard Code for Information Interchange)是一種字符編碼標準,在計算機和通信設備中表示文本和符號。 * 字符集:ASCII 定義了128個字符的集合,包括英文字母(大小寫)、數字、標點符號和控制字符。 * 編碼範圍:每個字符都由一個7位的二進制數表示,範圍從0到127。這使得 ASCII 能夠表示128個不同的字符。 * 數字(48-57):從0到9。 * 大寫字母(65-90):從A到Z。 * 小寫字母(97-122):從a到z。 * 標點符號和其他符號:如逗號、句號、驚嘆號、問號等。  圖片來源:https://www.sciencebuddies.org/science-fair-projects/references/ascii-table 對照一下剛才的舉例: * A=65 * P=80 * C=67 * S=83 ※ 注意,本表是十六進位,需轉換為十進位! ```cpp 'A' + 'P' + 'C' + 'S' = 65 + 80 + 67 + 83 = 295 ``` 所以,其實不管是 `string` 還是 `char`,本質上都還是用整數在儲存資料。 ## ASCII應用 如果今天我有一個字串 "123456" ,但我想轉成整數來儲存或者運算,該怎麼做呢? 答案其實不難,我們只需要將數字平移就好了,原本對應的區間是31~36,只要我通通減去30,區間就會變成1~6了,這時候就和原本的數字相對應了,於是查找表中編號30的字元,發現是 '0' ,至此我們可以將字串轉換成整數的程式碼完成了。 ```cpp= string s="123456"; int n=0; // 利用 for 迴圈遍歷字串 s for(int i=0;i<6;i++){ n = n * 10 + (s[i] - '0'); // 乘以10是為了進位,因為是從最高位數開始讀取的 } cout << n; ``` ### 輸出結果 ``` 123456 ``` ### Python對照 Python 更簡單,直接用 `int(s)` 就可以把字串轉整數了: ```python= s = "123456" print(int(s)); ``` 至於ASCII的用法,則有以下函式可以使用: * ord(字元):取得對應的 ASCII 值(整數) * chr(整數):將整數轉回對應的字元 ```python print(ord('A')) # 65 print(chr(67)) # 'C' ``` 前面有提到過,Python 中沒有 `char` 類別,所以不管進行字元或字串相加,都會被視為是字串串接,如果想要做到和C++一樣的字元相加變ASCII相加,就得使用`ord()`。 ```python c1 = 'A' c2 = 'P' c3 = 'C' c4 = 'S' print(ord(c1) + ord(c2) + ord(c3) + ord(c4)) # 295 ``` --- 聯絡方式:codecodefunny@gmail.com 最後編修時間:2025/07/10 子柚筆
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up