以下是原文翻译成繁體中文的版本,使用了Markdown格式:

C - Array of Strings

# C 語言中的字串陣列

你好,初學編程者!今天,我們將踏上一段令人興奮的旅程,進入 C 語言的世界,特別是探討字串陣列的概念。如果你完全是編程新手,別擔心;我會帶你一步步學習,使用我在教室多年來一貫的細心與耐心。那麼,我們一起來看看吧!

## C 語言中什麼是字串陣列?

想像你正在整理書架。每個書架可以放多本書,對吧?在 C 語言中,字串陣列的工作原理也是類似的。它就像是一個收藏書籍的書架(陣列),每個書架上都放著一本書(一個字串)。

從技術角度來說,C 語言中的字串陣列是一個字符的二維陣列。這是一種將多個字串存儲在單一變量中的方式。這個陣列中的每個字串實際上是一個字符的一維陣列。

讓我們用一個簡單的比喻來說明:
- 如果一個字串像是一個單詞,那麼字串陣列就像是一個句子。
- 如果一個字串像是一個單一的書名,那麼字串陣列就像是一個書名目錄。

## 宣告和初始化字串陣列

現在,讓我們學習如何在 C 語言中創建我們的「書架」。以下是如何宣告和初始化字串陣列的方法:

```c
char books[3][20] = {
    "C Programming",
    "Python Basics",
    "Java for Beginners"
};

在這個例子中:

  • books是我們陣列的名稱
  • [3]表示我們存儲了3個字串
  • [20]意味著每個字串最多可以有20個字符長
  • 我們已經用三個書名初始化了它

記住,在 C 語言中,字串總是以 null 字符 '\0' 結尾,所以請確保為它們分配足夠的空間!

打印字串陣列

現在,我們有了書架,讓我們學習如何顯示其內容。我們可以使用一個簡單的循環來打印每個字串:

#include <stdio.h>

int main() {
    char books[3][20] = {
        "C Programming",
        "Python Basics",
        "Java for Beginners"
    };

    for(int i = 0; i < 3; i++) {
        printf("%s\n", books[i]);
    }

    return 0;
}

這段代碼將打印:

C Programming
Python Basics
Java for Beginners

在這裡,books[i] 給我們我們陣列中的第 i 個字串。%s 格式指定告訴 printf 預期會有一個字串。

字串陣列在記憶體中是如何存儲的?

現在,讓我們掀開帷幕,看看我們的書架在計算機記憶體中是如何組織的。

C 語言中的字串陣列是作為一個連續的記憶體塊存儲的。每個字串佔據一個固定的空間(在我們的例子中,20個字符),無論其實際長度如何。

以下是一個視覺表示:

記憶體地址 | 內容
----------|-----------------
0x1000    | C Programming\0...
0x1014    | Python Basics\0...
0x1028    | Java for Beginners\0

每行代表一個字串,它們在記憶體中一個接一個地存儲。

使用指針的字串陣列

隨著你在 C 語言中的進步,你會遇到一種更靈活的創建字串陣列的方法,使用指針:

char *books[] = {
    "C Programming",
    "Python Basics",
    "Java for Beginners"
};

這種方法允許不同長度的字串,因為 books 的每個元素都是指向字串的指針,而不是固定大小的陣列。

找到最長的字串

讓我們用一個實際的例子來應用我們的知識。以下是一個程序,用於找到我們陣列中最長的字串:

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

int main() {
    char *books[] = {
        "C Programming",
        "Python Basics",
        "Java for Beginners"
    };
    int n = sizeof(books) / sizeof(books[0]);
    int max_length = 0;
    char *longest_book = NULL;

    for(int i = 0; i < n; i++) {
        int length = strlen(books[i]);
        if(length > max_length) {
            max_length = length;
            longest_book = books[i];
        }
    }

    printf("最長的書名是:%s\n", longest_book);
    return 0;
}

這個程序將輸出:

最長的書名是:Java for Beginners

字串陣列按升序排序

作為最後的挑戰,讓我們將我們的字串陣列按字母順序排序:

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

int main() {
    char *books[] = {
        "C Programming",
        "Python Basics",
        "Java for Beginners"
    };
    int n = sizeof(books) / sizeof(books[0]);

    for(int i = 0; i < n-1; i++) {
        for(int j = i+1; j < n; j++) {
            if(strcmp(books[i], books[j]) > 0) {
                char *temp = books[i];
                books[i] = books[j];
                books[j] = temp;
            }
        }
    }

    printf("排序後的書名:\n");
    for(int i = 0; i < n; i++) {
        printf("%s\n", books[i]);
    }

    return 0;
}

這將輸出:

排序後的書名:
C Programming
Java for Beginners
Python Basics

我們在這裡使用了冒泡排序演算法,通過使用 strcmp() 比較相鄰的字串,並在它們的順序錯誤時將它們交換。

至此,我們已經探討了 C 語言中字串陣列的世界,從基本概念到實際應用。記住,編程就像學習一門新語言 - 它需要練習和耐心。如果你一下子不能完全理解,不要氣餒。持續編碼,持續實驗,最重要的是,持續享受樂趣!

方法 描述
strlen() 計算字串的長度
strcmp() 比較兩個字串
strcpy() 將一個字串複製到另一個字串
strcat() 連接兩個字串
strtok() 將字串拆分成多個記號

這些字串操作函數將成為你繼續 C 語言編程旅程中的最好夥伴。快樂編程!

Credits: Image by storyset