Semorphe

字串

一段文字也可以是一個變數。 · ⏱ 約 25 分鐘

你會學到三件事

  1. string 裝一整段文字
  2. 怎麼問它有多長、怎麼拿第幾個字
  3. 為什麼從 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}
"Semorphe"變數name換行列表name的長度換行0取得字串name第 [] 個字元換行變數name變數name"!"+變數name換行0回傳印出設成印出印出印出建立文字name內容定義函式 回傳型別int(整數)main使用命名空間std引入函式庫vector(動態列表)引入函式庫string(文字處理)引入函式庫iostream(輸入輸出)123456789101112

到編輯器照著做一次:跟著做

換你了

印出這個字串的最後一個字

提示:長度是 name.size(),而最後一個的位置比它小 1。

到編輯器做這一題:練習:印出最後一個字

做一個

讀進一個英文名字,依序印出長度、第一個字、最後一個字(各一行)。

⚠️ 最後一個字的位置不是 length(),而是 length() - 1——想一下為什麼。 裁判用的是 Semorphe

到編輯器做這一題:做一個:一個名字的三件事

這一課你做了什麼

如果卡住了

你看到 多半是因為
印出來是空的或亂碼 位置超出範圍了(例如 name[8],而最大是 [7]
name.size 報錯 少了括號。它是一個問句,要寫成 size()
+ 接不起來 兩邊至少要有一邊是 string"a" + "b" 兩個都是字面值,不行
中文字算出來的長度很怪 一個中文字佔好幾格。這一課先用英文
在編輯器打開這一課 →