本文系統整理 C++ 中數組與字符串的核心知識點,涵蓋數組定義、初始化、作為函數參數的傳遞機制、多維數組細節,以及 C 風格字符串與 std::string 對象的操作差異、轉換、常用函數,配合代碼示例與圖解,適合基礎鞏固與面試準備。
// 計算數組長度
sizeof(A) / sizeof(int);
// 靜態數組未初始化 → 元素自動為 0
static int A[10]; // 全 0
// 函數內部動態數組未初始化 → 隨機值
int A[10]; // 垃圾值
本質:傳遞的是數組首地址(指針),形參數組實為實參數組別名。
// 形參寫法等價
void func(int arr[]); // 可省略長度
void func(int arr[10]); // 長度無實際作用
void func(int *arr); // 本質相同
// 第一維可寫長度也可不寫,其他維必須與實參一致
void func(int arr[][3][4]); // 正確
void func(int arr[2][3][4]); // 正確
'\0' (ASCII 0) 結束的字符數組。\0。cin >> str; cout << str; 一次輸入/輸出整個字符串(遇空白停止)。gets/puts(不安全)、fgets/fputs、scanf/printf 格式化。<string.h>)strlen、strcpy、strncpy、strcat、strncat、strcmp、strncmp、strchr、strstr 等。n 版本限制長度。std::string 對象優勢:自動管理內存、無需手動處理 \0、支持運算符重載(賦值、連接、比較)、提供豐富成員函數。
string s1; // 空串
string s2("hello"); // 從 C 串
string s3 = "world"; // 拷貝初始化
string s4(10, 'a'); // 10 個 'a'
string s = "hello";
const char* cstr = s.c_str(); // 轉 C 串(只讀)
char buf[20];
strcpy(buf, s.c_str()); // 複製到字符數組
| 操作 | C 風格 | string 對象 |
|---|---|---|
| 賦值 | strcpy | s1 = s2; |
| 連接 | strcat | s1 += s2; 或 s1.append(s2) |
| 比較 | strcmp | s1 == s2, s1 < s2 等運算符 |
| 長度 | strlen | s.size() / s.length() |
| 訪問字符 | s[i] | s[i] 或 s.at(i) (帶越界檢查) |
| 查找 | strchr/strstr | s.find(), s.rfind() |
| 子串 | 手動實現 | s.substr(pos, len) |
| 插入/刪除 | 手動實現 | s.insert(), s.erase() |
string names[3] = {"Alice", "Bob", "Charlie"};
vector vec = {"one", "two"}; // 更推薦用 vector
sizeof(arr) 返回整個數組大小,而非指針大小。int arr[] 實為 int* arr,sizeof(arr) 返回指針大小。\0,strlen 不計入,sizeof 計入;string 內部不依賴 \0 但 c_str() 返回的 C 串以 \0 結尾。strcpy/strcat 時務必確保目標空間足夠,或改用 strncpy/strncat / string。