C++ 字串:初學者的友好指南

你好,未來的編程超新星!作為一位具有多年經驗的計算機科學教師,我非常高興能帶領你進入 C++ 字串的奇妙世界。如果你從未寫過一行代碼也不用擔心——我們將從最基本的開始,一起逐步學習。到了這個教學的結尾,你將會和其他人一樣熟練地使用字串!(對不起,我忍不住開了一個字串的玩笑來開場!)

C++ Strings

C 風格的字串

讓我們從 C++ 中所有字串的祖先開始:C 風格的字串。這種字串是從 C 程序設計語言遺留下来,但在 C++ 中仍然需要理解。

C 風格字串是什麼?

C 風格字串實際上是一個以特殊字符(null 終止符 \0)結尾的字元數組。這個 null 終止符告訴計算機字串在哪裡結束。

這裡有一個簡單的例子:

char greeting[] = "Hello";

在這個例子中,greeting 實際上是一個 6 個字元的數組:{'H', 'e', 'l', 'l', 'o', '\0'}

使用 C 風格字串

讓我們看看一些 C 風格字串的常見操作:

  1. 聲明和初始化:
char name[20] = "Alice";  // 聲明一個最大長度為 19 個字元的字串(加上 null 終止符)
char city[] = "New York"; // 大小會自動確定
  1. 輸入和輸出:
#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() 來讀取整行的輸入,包括空格。

  1. 字串操作:

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 對象

讓我們看一些例子:

  1. 聲明和初始化:
std::string greeting = "Hello, world!";
std::string name("Alice");
std::string empty_string;  // 創建一個空字串
  1. 輸入和輸出:
#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() 讀取整行的輸入,包括空格。

  1. 字串操作:

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++ 中通常更受青睞,有幾個原因:

  1. 自動管理記憶體
  2. 更安全、更容易使用
  3. 更方便的操作(如使用 + 運算符進行連接)
  4. 提供豐富的成員函式

這裡有一個快速比較:

// 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