C語言自學攻略-字元陣列與字串函式操作

更新 發佈閱讀 10 分鐘

基礎觀念

字元陣列 (Character Array)

在C語言中,字串(string)其實是以字元陣列來表示的。在程式中,一個字串通常以 '\0' (ASCII碼為0的字元) 作為結束標記。
例如:

char str[] = "Hello";

編譯器會自動在陣列尾巴加上一個 '\0',實際記憶體佈局為:

{'H', 'e', 'l', 'l', 'o', '\0'}

上述 str 的型態是 char [6],含5個可見字元加上1個字串結尾字元。

當然,你也可以照樣宣告字元陣列:

char str[] = {'H', 'e', 'l', 'l', 'o', '\0'};

然後我們可以修改 str 內的字元:

str[0] = 'a'; // 允許,變成 "aello"
printf("%s\n", str); // 輸出: aello

字元指標 (char *)

現在若你宣告一個指標指向str

char *p = str;

此時 pchar * 型態。

  • p 指向 str[0] 這個字元。
  • 在C中,使用字元陣列名稱(如 str)在表達式中會自動轉換為指向起始元素的指標,也就是 char * ,指向 str[0]

透過 p 你可以使用指標運算來存取字串中的每個字元:

#include <stdio.h>

int main() {
char str[] = "Hello";
char *p = str;
printf("%c\n", *str); // 輸出 'H'
printf("%c\n", *p); // 輸出 'H'
printf("%c\n", *(p+1)); // 輸出 'e'

printf("%s\n", str); // 輸出 'Hello' //直接輸出字元陣列 str(會從 str[0] 開始,直到遇到 '\0' 為止)
printf("%s\n", p); // 輸出 'Hello' //行為與 str 相同
printf("%s\n", str+1); // 輸出 'ello' // str+1 表示從 str[1] 開始,輸出 "ello"
printf("%s\n", p+2); // 輸出 'llo' // p+2 表示從 str[2] 開始,輸出 "llo"
return 0;
}
  • 特別留意,字串結尾的 '\0' 字元讓程式知道字串到此結束。

字串基本操作

C語言中有一些由標準函式庫提供的許多字串操作函式,這些函式定義在 <string.h> 中。

常見的字串函式如下:

  1. strlen()
    用於取得字串長度(不含 '\0' 結尾字元)。
    範例:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello";
printf("Length: %zu\n", strlen(str)); // 輸出 5
return 0;
}

  1. strcpy()
    src 字串複製到 dest,含結尾的 '\0'。使用者必須確保 dest 有足夠空間。
    範例:
char source[] = "Hello";
char destination[20];
strcpy(destination, source);
// destination 內容變成 "Hello"

  1. strcat()

src 字串接續在 dest 字串的尾巴。dest 必須有足夠空間,且本身必須是一個有效字串(結尾有 '\0'),strcat 會找到 dest 尾端後開始複製 src

範例:

char dest[20] = "Hello";
char src[] = " World";
strcat(dest, src);
// dest 內容變成 "Hello World"

  1. strcmp()

字串比較,逐字元比較 s1s2 的ASCII碼值,注意,是逐字元作比較。

回傳值:

      • -1 表示 s1 < s2
      • 0 表示 s1 == s2
      • 1 表示 s1 > s2

範例:

int result = strcmp("apple", "banana"); // a < b => result = -1

strncpy, strncat等加上 'n' 的版本是有長度限制的版本。

  1. strncpy()

複製局部的字元陣列。

範例 :

#include <stdio.h>
#include <string.h>

int main() {
// 1. 初始化源字串 src 和目標陣列 dest
char src[] = "Hello !"; // src 是一個包含字串 "Hello !" 的陣列,實際大小為 8(包含 '\0')
char dest[20] = "abcdefghijk"; // dest 是一個長度為 20 的字元陣列,初始值為 "abcdefghijk"

// 2. 使用 strncpy 將 src 的前 3 個字元複製到 dest 的前 3 個字元,dest 中的其餘部分保持不變
strncpy(dest, src, 3);
// src 的前 3 個字元是 "Hel",所以 dest 的前 3 個字元會被覆蓋成 "Hel"
// 原來的 dest = "abcdefghijk" 變成了 "Heldefghijk"("defghijk" 保持不變,因為沒有被覆蓋)
printf("src: %s\n", src); // 輸出 src: Hello !
printf("dest: %s\n", dest); // 輸出 dest: Heldefghijk

// 3. 使用 strncpy 將 src 的前 7 個字元(包含空白字元)複製到 dest 的前 7 個字元
strncpy(dest, src, 7);
// src 的前 7 個字元是 "Hello !"(包含空白字元)
// 這次 dest 的前 7 個字元會被覆蓋為 "Hello !",其餘未被覆蓋的部分 "hijk" 保持不變
// 原來的 dest = "Heldefghijk" 變成了 "Hello !hijk"
printf("src: %s\n", src); // 輸出 src: Hello !
printf("dest: %s\n", dest); // 輸出 dest: Hello !hijk

// 4. 使用 strncpy 複製 src 的前 8 個字元到 dest,這超出了 src 的實際長度
strncpy(dest, src, 8);
// src 只有 7 個可見字元和 1 個結束符 '\0',這次複製的 n 是 8
// 當 n = 8 時,strncpy 會嘗試將 src 的 8 個字元複製到 dest
// 由於 src 中的第 8 個字元是 '\0',strncpy 會將它一併複製到 dest
// 最後 dest 的前 8 個字元變成了 "Hello !\0",而後續的 "hijk" 仍然存在
// 但因為 '\0' 是字串的結束符,printf 只會輸出到 '\0' 為止,所以輸出會是 "Hello !"
printf("src: %s\n", src); // 輸出 src: Hello !
printf("dest: %s\n", dest); // 輸出 dest: Hello !

return 0;
}

  1. strncat

src 字串的前 n 個字元追加到 dest 字串的後面。

範例 :

#include <stdio.h>
#include <string.h>

int main() {
char src[] = " World!";
char dest[20] = "Hello"; // dest 預先定義為 "Hello"

// 使用 strncat 連接 src 的前 3 個字元到 dest
strncat(dest, src, 3); // 只將 " Wo" 連接到 dest

printf("src: %s\n", src);
printf("dest: %s\n", dest);

return 0;
}
/* 輸出
src: World!
dest: Hello Wo
*/
留言
avatar-img
電資鼠 - 您的學習好夥伴
19會員
242內容數
在當今數位時代,電資領域人才需求爆發式成長,不論是前端網頁設計、嵌入式開發、人工智慧、物聯網還是軟硬體整合,這些技術都在改變世界。而掌握 C/C++、Python、數位邏輯、電路學與嵌入式開發等大學電資領域的課程,正是進入這個高薪、高需求產業的關鍵!
2025/03/07
本章節將探討左下三角稀疏矩陣。
Thumbnail
2025/03/07
本章節將探討左下三角稀疏矩陣。
Thumbnail
2025/03/07
相信讀者現在對於鏈結串列有了更多的認識,所以我再進一步,示範更多關於鏈結串列的操作,這部分示範會將程式模組化。將鏈結串列的操作寫進一個標頭檔,並在主程式中引入。
Thumbnail
2025/03/07
相信讀者現在對於鏈結串列有了更多的認識,所以我再進一步,示範更多關於鏈結串列的操作,這部分示範會將程式模組化。將鏈結串列的操作寫進一個標頭檔,並在主程式中引入。
Thumbnail
2025/03/07
本章節示範透過「陣列索引」和「指標運算」兩種方式來存取同一個二維陣列 a,並印出相同的數值以及對應的位址,以說明它們其實指向的是同一塊連續的記憶體空間。本文將依序解釋各段程式碼,並示範可能的執行結果與背後原理。
Thumbnail
2025/03/07
本章節示範透過「陣列索引」和「指標運算」兩種方式來存取同一個二維陣列 a,並印出相同的數值以及對應的位址,以說明它們其實指向的是同一塊連續的記憶體空間。本文將依序解釋各段程式碼,並示範可能的執行結果與背後原理。
Thumbnail
看更多
你可能也想看
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
在本章節中,我們將學習JavaScript的基本語法,包括如何註解代碼和如何聲明變數。瞭解這些基礎知識對於進一步學習和使用JavaScript來編寫代碼是非常重要的。
Thumbnail
在本章節中,我們將學習JavaScript的基本語法,包括如何註解代碼和如何聲明變數。瞭解這些基礎知識對於進一步學習和使用JavaScript來編寫代碼是非常重要的。
Thumbnail
在 Google 試算表中,LEFT、MID、RIGHT 函式都是用來擷取文字字串中特定部分的函式。我想在這次的教學簡單介紹一下它們,歡迎來看看! LEFT:從左邊(開頭)取字串 我們可以用 LEFT 函式從字串的左邊(開頭)取指定字數的字串。 語法 =LEFT(字串, 要取的
Thumbnail
在 Google 試算表中,LEFT、MID、RIGHT 函式都是用來擷取文字字串中特定部分的函式。我想在這次的教學簡單介紹一下它們,歡迎來看看! LEFT:從左邊(開頭)取字串 我們可以用 LEFT 函式從字串的左邊(開頭)取指定字數的字串。 語法 =LEFT(字串, 要取的
Thumbnail
接下來喜特先生會介紹一系列關於文字處理時,會常常運用到的函式。我們這次先從比較簡單的 LEN、CHAR 和 REPT 開始,之後會陸續介紹其他的。如果你有什麼想要了解的函式,歡迎在下面留言告訴我! LEN:字元長度 我們可以用 LEN 函式取得儲存格或字元的長度。 語法相當簡單:
Thumbnail
接下來喜特先生會介紹一系列關於文字處理時,會常常運用到的函式。我們這次先從比較簡單的 LEN、CHAR 和 REPT 開始,之後會陸續介紹其他的。如果你有什麼想要了解的函式,歡迎在下面留言告訴我! LEN:字元長度 我們可以用 LEN 函式取得儲存格或字元的長度。 語法相當簡單:
Thumbnail
C 語言的函式庫定義了許多好用的函式,在寫 C++ 的時候可以拿來用。這是因為 C++ 當初在設計的時候,就有刻意把 C 涵蓋進來。 基本用法 首先要導入 C 語言的標準函式庫: #include <cstdlib> 以 c 作為開頭表示它是 C 語言的函式庫,只是被我們拿來 C++ 的程式
Thumbnail
C 語言的函式庫定義了許多好用的函式,在寫 C++ 的時候可以拿來用。這是因為 C++ 當初在設計的時候,就有刻意把 C 涵蓋進來。 基本用法 首先要導入 C 語言的標準函式庫: #include <cstdlib> 以 c 作為開頭表示它是 C 語言的函式庫,只是被我們拿來 C++ 的程式
Thumbnail
高中數學主題練習—C計算(一)
Thumbnail
高中數學主題練習—C計算(一)
Thumbnail
有個簡單的方法,把儲存格的文字串連起來!一起來看看怎麼做,很好操作唷!
Thumbnail
有個簡單的方法,把儲存格的文字串連起來!一起來看看怎麼做,很好操作唷!
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News