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
留言分享你的想法!
avatar-img
電資鼠 - 您的學習好夥伴
9會員
215內容數
在當今數位時代,電資領域人才需求爆發式成長,不論是前端網頁設計、嵌入式開發、人工智慧、物聯網還是軟硬體整合,這些技術都在改變世界。而掌握 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
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 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