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
*/
在當今數位時代,電資領域人才需求爆發式成長,不論是前端網頁設計、嵌入式開發、人工智慧、物聯網還是軟硬體整合,這些技術都在改變世界。而掌握 C/C++、Python、數位邏輯、電路學與嵌入式開發等大學電資領域的課程,正是進入這個高薪、高需求產業的關鍵!
留言
avatar-img
留言分享你的想法!

































































本章將深入探討 C 語言的三維陣列與指標,這是更難理解的概念,不過掌握到核心,其實並不會太複雜。 本文詳細剖析這一主題並給出實際執行範例,在搭配演示下,將更容易學習這一進階知識與與其使用方式。
本章將深入探討 C 語言中的二維陣列與指標,這是很多人學習C語言上會遇到的難題。也是大學教授喜歡考的內容,更是以後進階主題與應用的基石,二維陣列的元素在記憶體中是連續存放的,而指標可以靈活存取這些元素,提供更高效的操作方式。本章將詳細帶你學會如何使用,提升你的 C 語言開發能力。
這篇文章探討 C 語言中 sizeof 運算符在不同情況下的輸出結果,包括陣列、指標以及指標運算。文章詳細解釋了每個例子中 sizeof 運算符的行為,並說明瞭陣列名稱在不同語境下的含義。
本章將深入解析 C 語言的指標 (Pointers),這是 C 語言中最重要且強大的概念之一。指標能夠 直接操作記憶體位址,使程式具備更高的效能與靈活性,並廣泛應用於 陣列、函式、結構體與動態記憶體管理 等領域。
本章將介紹 C 語言的函式 (Functions),這是將程式碼模組化、提高可讀性與重用性 的關鍵技術。透過函式,我們可以 拆分程式邏輯、減少重複代碼,本章亦透過實作讓讀者學習 參數傳遞、回傳值、遞迴等重要觀念。
本章將介紹 C 語言的陣列 (Arrays),這是一種 連續儲存多個相同類型變數 的數據結構。透過陣列,我們可以有效管理與操作大量數據,並應用在 數據處理、排序、搜尋與多維數據存取 等情境中。
本章將深入探討 C 語言的三維陣列與指標,這是更難理解的概念,不過掌握到核心,其實並不會太複雜。 本文詳細剖析這一主題並給出實際執行範例,在搭配演示下,將更容易學習這一進階知識與與其使用方式。
本章將深入探討 C 語言中的二維陣列與指標,這是很多人學習C語言上會遇到的難題。也是大學教授喜歡考的內容,更是以後進階主題與應用的基石,二維陣列的元素在記憶體中是連續存放的,而指標可以靈活存取這些元素,提供更高效的操作方式。本章將詳細帶你學會如何使用,提升你的 C 語言開發能力。
這篇文章探討 C 語言中 sizeof 運算符在不同情況下的輸出結果,包括陣列、指標以及指標運算。文章詳細解釋了每個例子中 sizeof 運算符的行為,並說明瞭陣列名稱在不同語境下的含義。
本章將深入解析 C 語言的指標 (Pointers),這是 C 語言中最重要且強大的概念之一。指標能夠 直接操作記憶體位址,使程式具備更高的效能與靈活性,並廣泛應用於 陣列、函式、結構體與動態記憶體管理 等領域。
本章將介紹 C 語言的函式 (Functions),這是將程式碼模組化、提高可讀性與重用性 的關鍵技術。透過函式,我們可以 拆分程式邏輯、減少重複代碼,本章亦透過實作讓讀者學習 參數傳遞、回傳值、遞迴等重要觀念。
本章將介紹 C 語言的陣列 (Arrays),這是一種 連續儲存多個相同類型變數 的數據結構。透過陣列,我們可以有效管理與操作大量數據,並應用在 數據處理、排序、搜尋與多維數據存取 等情境中。
你可能也想看
Google News 追蹤
Thumbnail
在本章節中,我們將學習JavaScript的基本語法,包括如何註解代碼和如何聲明變數。瞭解這些基礎知識對於進一步學習和使用JavaScript來編寫代碼是非常重要的。
Thumbnail
接下來喜特先生會介紹一系列關於文字處理時,會常常運用到的函式。我們這次先從比較簡單的 LEN、CHAR 和 REPT 開始,之後會陸續介紹其他的。如果你有什麼想要了解的函式,歡迎在下面留言告訴我! LEN:字元長度 我們可以用 LEN 函式取得儲存格或字元的長度。 語法相當簡單:
Thumbnail
C 語言的函式庫定義了許多好用的函式,在寫 C++ 的時候可以拿來用。這是因為 C++ 當初在設計的時候,就有刻意把 C 涵蓋進來。 基本用法 首先要導入 C 語言的標準函式庫: #include <cstdlib> 以 c 作為開頭表示它是 C 語言的函式庫,只是被我們拿來 C++ 的程式
※ 常用arry型態的方法: 長度: length 查詢第N個元素: [] 查詢元素在第N個: indexOf( ) 判斷是否為array: isArray() 新增和刪除: push():新增後面的數值 unshift():新增前面的數值 pop():刪除後面的數值 sh
Thumbnail
有個簡單的方法,把儲存格的文字串連起來!一起來看看怎麼做,很好操作唷!
Thumbnail
在本章節中,我們將學習JavaScript的基本語法,包括如何註解代碼和如何聲明變數。瞭解這些基礎知識對於進一步學習和使用JavaScript來編寫代碼是非常重要的。
Thumbnail
接下來喜特先生會介紹一系列關於文字處理時,會常常運用到的函式。我們這次先從比較簡單的 LEN、CHAR 和 REPT 開始,之後會陸續介紹其他的。如果你有什麼想要了解的函式,歡迎在下面留言告訴我! LEN:字元長度 我們可以用 LEN 函式取得儲存格或字元的長度。 語法相當簡單:
Thumbnail
C 語言的函式庫定義了許多好用的函式,在寫 C++ 的時候可以拿來用。這是因為 C++ 當初在設計的時候,就有刻意把 C 涵蓋進來。 基本用法 首先要導入 C 語言的標準函式庫: #include <cstdlib> 以 c 作為開頭表示它是 C 語言的函式庫,只是被我們拿來 C++ 的程式
※ 常用arry型態的方法: 長度: length 查詢第N個元素: [] 查詢元素在第N個: indexOf( ) 判斷是否為array: isArray() 新增和刪除: push():新增後面的數值 unshift():新增前面的數值 pop():刪除後面的數值 sh
Thumbnail
有個簡單的方法,把儲存格的文字串連起來!一起來看看怎麼做,很好操作唷!