字串
一段文字也可以是一個變數。 · ⏱ 約 25 分鐘
你會學到三件事
- 用
string 裝一整段文字
- 怎麼問它有多長、怎麼拿第幾個字
- 為什麼從 0 開始數
開始之前
到目前為止,文字都是寫死在 cout 裡的字面值:
cout << "Hello!" << endl;
而 char 一次只裝得下一個字元。這一課要裝一整段。
一、宣告一個字串
string name = "Semorphe";
cout << name << endl; // Semorphe
和 int age = 16; 是同一個形狀——只是型態換成 string,
裝的東西換成一段用雙引號包起來的文字。
積木盤上這一顆寫著「建立文字 … 內容 …」。
第 2 課那條規則還是成立:雙引號是文字,單引號是一個字元。
二、問它有多長
cout << name.size() << endl; // 8
name.size() 這個寫法是新的:點 + 名字 + 一對括號。
意思是「去問 name 這個東西,它的 size 是多少」。
它跟 cout 不一樣——cout 是一個東西,而 size() 是對某個東西問的問題。
這個「點」的寫法之後會一直出現(v.push_back(...)、v.size()……)。
🟢 那個點,唸成「的」。
name.size() → name 「的」 size
v.push_back() → v 「的」 push_back
唸出來就順了:點的左邊是誰,右邊是問它什麼、或叫它做什麼。
三、拿第幾個字
cout << name[0] << endl; // S
⚠️ [0] 拿到的是第一個字,不是第二個。
程式裡數東西從 0 開始——和上一課的陣列一模一樣:
S e m o r p h e
0 1 2 3 4 5 6 7 ← 位置
← 長度是 8,而最後一個的位置是 7
最後一個的位置永遠是「長度減一」。 這件事在陣列那一課會再遇到一次,
而它是初學者最常出錯的地方——寫 name[8] 會拿到不存在的東西。
四、接起來
name = name + "!";
cout << name << endl; // Semorphe!
+ 用在數字上是相加,用在字串上是接起來。同一個符號,兩種意思。
而這一行的形狀你已經見過了——第 6 課的 score = score + 5;:
先算右邊,再放回左邊。
完成的樣子
這一課的參考做法——程式碼每一行的號碼,就印在對應的那塊積木上。
1#include <iostream>2#include <string>3#include <vector>4using namespace std;5int main() {6 string name = "Semorphe";7 cout << name << endl;8 cout << name.size() << endl;9 cout << name[0] << endl;10 name = name + "!";11 cout << name << endl;12 return 0;13}
到編輯器照著做一次:跟著做
換你了
印出這個字串的最後一個字。
提示:長度是 name.size(),而最後一個的位置比它小 1。
到編輯器做這一題:練習:印出最後一個字
做一個
讀進一個英文名字,依序印出長度、第一個字、最後一個字(各一行)。
⚠️ 最後一個字的位置不是 length(),而是 length() - 1——想一下為什麼。
裁判用的是 Semorphe。
到編輯器做這一題:做一個:一個名字的三件事
這一課你做了什麼
- 你用
string 裝了一整段文字
- 你學會了「點」的寫法:問一個東西某件事
- 你知道位置從 0 開始,而最後一個是「長度減一」
如果卡住了
| 你看到 |
多半是因為 |
| 印出來是空的或亂碼 |
位置超出範圍了(例如 name[8],而最大是 [7]) |
name.size 報錯 |
少了括號。它是一個問句,要寫成 size() |
用 + 接不起來 |
兩邊至少要有一邊是 string。"a" + "b" 兩個都是字面值,不行 |
| 中文字算出來的長度很怪 |
一個中文字佔好幾格。這一課先用英文 |
在編輯器打開這一課 →