1. 前言
C語言至今仍廣泛應用於系統程式設計與嵌入式程式設計領域。在這種語言中,字串與陣列是管理資料的重要元素。學習 C 語言時,必須理解字串作為「字元陣列」的特殊規則,這是無法避開的重點。
本文將深入探討 C 語言中字串與陣列的基本概念,幫助從初學者到中級開發者釐清「字串與陣列的差異與關聯」的常見疑問。
此外,透過實際程式範例,我們還會介紹陣列與字串的宣告方式、基本的字串操作函數,以及記憶體管理的注意事項,讓您在 C 語言中能更安全且高效地進行字串操作。
2. 陣列的基礎
在 C 語言中,理解陣列是進行字串操作的基礎。本節將說明陣列的概念與使用方法。
什麼是陣列?
陣列是一種將相同型態的資料儲存在連續記憶體區域的結構。例如,宣告一個 int
型別的陣列,就能一次處理多個整數。C 語言中的陣列宣告方式如下:
int numbers[5]; // 可儲存 5 個整數的陣列
這段程式碼宣告了一個名為 numbers
的整數陣列,並配置了可以存放 5 個整數的記憶體空間。存取各元素時需使用索引。
陣列的宣告與初始化
陣列不僅可以宣告,還能在宣告時直接初始化。初始化是指在宣告的同時設定初始值。
int numbers[5] = {1, 2, 3, 4, 5}; // 陣列宣告並初始化
在此例中,numbers
陣列依序儲存了 1 到 5 的整數。如果省略初始化,陣列內容將是不確定的(記憶體中的殘留資料)。
陣列的記憶體配置與存取方式
C 語言中的陣列會在記憶體中連續配置。例如,宣告 int numbers[5]
時,numbers[0]
到 numbers[4]
會佔用連續的記憶體位置。
存取陣列元素需使用索引,索引從 0 開始,到 陣列大小 – 1 為止。
printf("%d", numbers[0]); // 輸出陣列的第一個元素
透過陣列,可以用一個變數管理多筆相同型態的資料,並進行有效率的操作。
3. 字串的基礎
在 C 語言中,字串並非單純的字元序列,而是以特殊的陣列形式存在。本節將介紹 C 語言中字串的結構與操作方式。
什麼是字串?
在 C 語言中,字串是以字元陣列表示,並在最後加上空字元('\0'
)作為結尾標記。這個空字元在字串操作中具有關鍵作用。
例如,可以這樣定義字串:
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
此處 greeting
陣列儲存了 “Hello” 五個字元,並在末尾加上空字元作為終止符號。
字串的宣告與初始化
在 C 語言中,可以直接使用字串常值進行宣告與初始化:
char greeting[] = "Hello";
這種寫法會由編譯器自動在字串末尾加入空字元,因此 greeting
的大小實際為 6(5 個字元 + 1 個空字元)。若忽略空字元的存在,可能導致非預期的錯誤。
4. 字串與陣列的關係
在 C 語言中,字串是以「字元陣列」實作的。本節將詳細說明字串作為陣列的意義,以及字串的宣告與初始化方法。
字串就是字元陣列
C 語言使用字元型別的陣列來儲存字串。例如:
char name[10] = "Alice";
此程式碼將字串 “Alice” 儲存在陣列 name
中。由於 C 語言會自動在末尾加上空字元('\0'
),所以實際內容如下:
{'A', 'l', 'i', 'c', 'e', '\0', '\0', '\0', '\0', '\0'}
字串宣告的注意事項
宣告字串時,陣列大小必須足夠容納字串長度加上空字元。
char name[3] = "Alice"; // 會導致錯誤
“Alice” 需要 6 個位元組(5 個字元 + 空字元),但這裡只分配了 3 個位元組。
字串的賦值與操作
C 語言不支援直接將整個陣列一次性賦值,因此需逐一修改元素或使用標準函式 strcpy
:
name[0] = 'B'; // 將 "Alice" 改成 "Blice"
strcpy(name, "Bob"); // 將 name 改成 "Bob"
字串的初始化方法
char greeting[] = "Hello";
未指定大小時,編譯器會自動分配足夠的空間,但若指定大小則需確保足夠。

5. 基本字串操作函式
C 標準函式庫提供多種字串操作函式,如複製、串接、長度取得與比較。
字串複製:strcpy
#include <string.h>
char source[] = "Hello";
char destination[10];
strcpy(destination, source); // 將 source 複製到 destination
目標陣列必須足夠大,否則會造成緩衝區溢位(Buffer Overflow)。
字串串接:strcat
char greeting[20] = "Hello";
char name[] = " World";
strcat(greeting, name); // greeting 變成 "Hello World"
取得字串長度:strlen
char greeting[] = "Hello";
int length = strlen(greeting); // length 為 5
strlen
不計算空字元。
字串比較:strcmp
char str1[] = "Hello";
char str2[] = "Hello";
char str3[] = "World";
int result1 = strcmp(str1, str2); // 0 (相同)
int result2 = strcmp(str1, str3); // 非 0 (不同)
6. 字串陣列(雙維陣列)
處理多個字串時,可以使用雙維陣列。
雙維陣列的宣告
char names[3][10] = {
"Alice",
"Bob",
"Carol"
};
存取雙維陣列
char first_char = names[0][0]; // 'A'
for (int i = 0; i < 3; i++) {
printf("%s\n", names[i]);
}
大小設定與初始化
char colors[3][10] = {"Red", "Green", "Blue"};
排序範例
#include <stdio.h>
#include <string.h>
int main() {
char names[3][10] = {"Bob", "Alice", "Carol"};
char temp[10];
for (int i = 0; i < 2; i++) {
for (int j = i + 1; j < 3; j++) {
if (strcmp(names[i], names[j]) > 0) {
strcpy(temp, names[i]);
strcpy(names[i], names[j]);
strcpy(names[j], temp);
}
}
}
for (int i = 0; i < 3; i++) {
printf("%s\n", names[i]);
}
return 0;
}
7. 記憶體管理與注意事項
緩衝區溢位(Buffer Overflow)
char buffer[10];
strcpy(buffer, "This is a very long string"); // 溢位範例
安全複製:strncpy
char buffer[10];
strncpy(buffer, "This is a very long string", sizeof(buffer) - 1);
buffer[sizeof(buffer) - 1] = '\0';
動態記憶體配置
char *str = (char *)malloc(20 * sizeof(char));
strcpy(str, "Dynamic allocation");
free(str);
避免記憶體洩漏
char *name = (char *)malloc(50 * sizeof(char));
strcpy(name, "John Doe");
free(name);
8. 總結
本文從 C 語言字串與陣列的基本知識,到字串操作函式、雙維陣列的應用與記憶體管理的重點,逐步進行說明。
核心重點
- 字串是以字元陣列儲存,並以空字元
'\0'
作結尾。 - 熟練使用
strcpy
、strcat
、strlen
、strcmp
等函式。 - 雙維陣列適合管理多個字串,但需注意大小限制。
- 正確的記憶體管理能避免溢位與記憶體洩漏。
結語
C 語言的字串與陣列操作雖然對初學者有一定難度,但只要掌握基礎語法與記憶體管理觀念,就能安全且高效地進行開發。