C++ 字串:初學者的友好指南
你好,未來的編程超新星!作為一位具有多年經驗的計算機科學教師,我非常高興能帶領你進入 C++ 字串的奇妙世界。如果你從未寫過一行代碼也不用擔心——我們將從最基本的開始,一起逐步學習。到了這個教學的結尾,你將會和其他人一樣熟練地使用字串!(對不起,我忍不住開了一個字串的玩笑來開場!)
C 風格的字串
讓我們從 C++ 中所有字串的祖先開始:C 風格的字串。這種字串是從 C 程序設計語言遺留下来,但在 C++ 中仍然需要理解。
C 風格字串是什麼?
C 風格字串實際上是一個以特殊字符(null 終止符 \0
)結尾的字元數組。這個 null 終止符告訴計算機字串在哪裡結束。
這裡有一個簡單的例子:
char greeting[] = "Hello";
在這個例子中,greeting
實際上是一個 6 個字元的數組:{'H', 'e', 'l', 'l', 'o', '\0'}
。
使用 C 風格字串
讓我們看看一些 C 風格字串的常見操作:
- 聲明和初始化:
char name[20] = "Alice"; // 聲明一個最大長度為 19 個字元的字串(加上 null 終止符)
char city[] = "New York"; // 大小會自動確定
- 輸入和輸出:
#include <iostream>
#include <cstring>
int main() {
char food[50];
std::cout << "你最喜欢的食物是什麼? ";
std::cin.getline(food, 50);
std::cout << "啊," << food << " 聽起來很好吃!" << std::endl;
return 0;
}
在這個例子中,我們使用 cin.getline()
來讀取整行的輸入,包括空格。
- 字串操作:
C 風格字串可以使用 <cstring>
函式庫中的函式進行操作。這裡有一些常見的:
函式 | 描述 | 示例 |
---|---|---|
strlen() |
獲取字串長度 | int len = strlen(name); |
strcpy() |
將一個字串複製到另一個 | strcpy(dest, src); |
strcat() |
連接字串 | strcat(str1, str2); |
strcmp() |
比較字串 | int result = strcmp(str1, str2); |
這裡有一個小程式,將這些函式投入使用:
#include <iostream>
#include <cstring>
int main() {
char first_name[20] = "John";
char last_name[20] = "Doe";
char full_name[40];
std::cout << "名字的長度: " << strlen(first_name) << std::endl;
strcpy(full_name, first_name);
strcat(full_name, " ");
strcat(full_name, last_name);
std::cout << "全名: " << full_name << std::endl;
if (strcmp(first_name, last_name) == 0) {
std::cout << "名字和姓氏一樣!" << std::endl;
} else {
std::cout << "名字和姓氏不一樣。" << std::endl;
}
return 0;
}
這個程序展示了計算字串長度、複製、連接和比較的功能。相當厲害,對吧?
C++ 中的 String 類
現在,讓我們來看看在 C++ 中處理字串的更現代、更方便的方法:std::string
類。
std::string 的介紹
std::string
類是 C++ 標準庫的一部分,提供了更用戶友好的方式來處理字串。它自動管理記憶體,並帶有一組非常有用的成員函式。
要使用 std::string
,你需要包含 <string>
頭文件:
#include <string>
創建和使用 std::string 對象
讓我們看一些例子:
- 聲明和初始化:
std::string greeting = "Hello, world!";
std::string name("Alice");
std::string empty_string; // 創建一個空字串
- 輸入和輸出:
#include <iostream>
#include <string>
int main() {
std::string favorite_color;
std::cout << "你最喜欢的顏色是什麼? ";
std::getline(std::cin, favorite_color);
std::cout << "啊," << favorite_color << " 是一個非常美麗的顏色!" << std::endl;
return 0;
}
注意我們如何使用 std::getline()
讀取整行的輸入,包括空格。
- 字串操作:
std::string
類提供許多有用的成員函式。這裡有一些常見的:
函式 | 描述 | 示例 |
---|---|---|
length() 或 size()
|
獲取字串長度 | int len = str.length(); |
empty() |
檢查字串是否為空 | if (str.empty()) { ... } |
append() 或 +=
|
附加到字串 |
str.append(" World"); 或 str += " World";
|
substr() |
獲取子字串 | std::string sub = str.substr(0, 5); |
find() |
尋找子字串 | size_t pos = str.find("hello"); |
replace() |
替換字串的一部分 | str.replace(0, 5, "Hi"); |
讓我們在程序中使用這些函式:
#include <iostream>
#include <string>
int main() {
std::string sentence = "The quick brown fox jumps over the lazy dog";
std::cout << "句子長度: " << sentence.length() << std::endl;
if (!sentence.empty()) {
std::cout << "句子不是空的。" << std::endl;
}
sentence += "!"; // 附加一個驚嘆號
std::cout << "更新後的句子: " << sentence << std::endl;
std::string sub = sentence.substr(4, 5); // 獲取 "quick"
std::cout << "子字串: " << sub << std::endl;
size_t fox_pos = sentence.find("fox");
if (fox_pos != std::string::npos) {
std::cout << "找到 'fox' 在位置: " << fox_pos << std::endl;
}
sentence.replace(fox_pos, 3, "cat");
std::cout << "替換後: " << sentence << std::endl;
return 0;
}
這個程序展示了各種字串操作,如獲取長度、檢查是否為空、附加、提取子字串、尋找和替換。
比較 C 風格字串和 std::string
雖然在某些上下文中仍然使用 C 風格字串(特別是當與 C 代碼交互時),但 std::string
在現代 C++ 中通常更受青睞,有幾個原因:
- 自動管理記憶體
- 更安全、更容易使用
- 更方便的操作(如使用
+
運算符進行連接) - 提供豐富的成員函式
這裡有一個快速比較:
// C 風格字串
char cstr1[20] = "Hello";
char cstr2[20];
strcpy(cstr2, cstr1); // 複製
strcat(cstr1, " World"); // 連接
// std::string
std::string str1 = "Hello";
std::string str2 = str1; // 複製
str1 += " World"; // 連接
如你所見,std::string
的操作更直觀,也更不易出錯。
結論
恭喜你!你已經邁出了進入 C++ 字串世界的第一步。我們介紹了 C 風格字串,這種稍微有些老式的字串,但仍然很重要,以及更現代、更方便的 std::string
類。
記住,熟能生巧。嘗試編寫一些使用這兩種類型的字串的程序,以加強你的學習。在你還沒有察覺之前,你將會像專家一樣操作字串!
持續編碼,持續學習,最重要的是,玩得開心!誰知道呢,也許有一天你會寫出自己的字串庫。在那之前,祝你編程愉快!
Credits: Image by storyset