C 語言中的字符串:初學者指南

你好,未來的程式設計師們!今天,我們將踏上一段令人興奮的旅程,進入 C 語言中的字符串世界。如果你完全是程式設計的新手,不必擔心——我將成為你的友好指南,我們會一步步來。到了這個教學的結尾,你將能像專業人士一樣與 C 語言一起編織字符串!

C - Strings

C 語言中的字符串是什麼?

我們先從基礎開始。在 C 語言中,字符串實質上是一個字符序列。把它想像成一根項鏈,每個珠子都是一個字符。這些字符存儲在連續的記憶體位置中,以一個特殊的字符結尾,這個字符叫做空字符('\0')。

這裡有一個有趣的事實:在 C 語言中,沒有為字符串單獨設置數據類型。相反,我們使用字符數組來表示字符串。這就像用一排郵政信箱來存儲一系列信件一樣!

在 C 語言中創建字符串

現在,讓我們動手創建我們在 C 語言中的第一個字符串。有幾種方法可以做到這點,但我們先從最直接的方法開始:

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

在這個例子中,我們創建了一個名為 greeting 的字符串,它包含了單詞 "Hello"。讓我們分解一下:

  • char 是字符的數據類型。
  • greeting 是我們字符串的名稱。
  • [6] 指定了我們數組的大小。我們需要 6 個空間:5 個給 "Hello",1 個給空字符。
  • 字符被單引號括起來,並用逗號分隔。
  • 不要忘記在結尾加上空字符 '\0'

不指定大小初始化字符串

C 還是挺聰明的,能夠為我們计算出字符串的大小。看看這個:

char greeting[] = "Hello";

這是不是很棒?C 自動添加空字符並計算大小。這就像魔法,但其實只是 C 的效率!

遍歷字符串

現在我們有了字符串,讓我們學習如何遍歷它。當你想逐個處理每個字符時,這很有用:

#include <stdio.h>

int main() {
char greeting[] = "Hello";
int i = 0;

while (greeting[i] != '\0') {
printf("%c", greeting[i]);
i++;
}

return 0;
}

這段代碼逐個打印 "Hello" 中的每個字符。循環會繼續,直到遇到空字符,這標誌著字符串的結尾。

使用 %s 格式指定符打印字符串

逐個字符遍歷字符串很有趣,但有一個更簡單的方法來打印字符串:

#include <stdio.h>

int main() {
char greeting[] = "Hello, World!";
printf("%s", greeting);
return 0;
}

%s 格式指定符告訴 printf 預期會有一個字符串。這就像給 printf 提個醒:"嘿,一個字符串要來了!"

使用雙引號構造字符串

記得我們第一個例子,我們一個字符一個字符地創建字符串?其實有一個捷徑:

char greeting[] = "Hello, World!";

這與我們早前的例子做了同樣的事情,但簡潔得多。C 代我們添加空字符。這就像訂購一個預先串好的項鏈,而不是自己串珠子!

使用 scanf() 函數進行字符串輸入

現在,讓我們通過從用戶那裡獲取輸入來使我們的程式更具互動性:

#include <stdio.h>

int main() {
char name[50];
printf("請輸入你的名字: ");
scanf("%s", name);
printf("你好,%s!\n", name);
return 0;
}

在這裡,我們使用 scanf() 從用戶那裡讀取字符串。但要注意!scanf() 在遇到第一個空白字符時停止讀取。所以如果你輸入 "John Doe",只有 "John" 會被存儲在 name 中。

處理含有空白的字符串輸入

要讀取含有空白的字符串,我們可以使用以下格式指定符與 scanf() 一起使用:

#include <stdio.h>

int main() {
char fullName[100];
printf("請輸入你的全名: ");
scanf("%[^\n]s", fullName);
printf("你好,%s!\n", fullName);
return 0;
}

%[^\n]s 格式指定符告訴 scanf() 讀取直到遇到換行符。這樣我們就可以讀取全名或含有空格的句子了。

使用 gets() 和 fgets() 函數進行字符串輸入

雖然 gets() 很容易使用,但它因為不進行邊界檢查而被認為是不安全的。相反,我們使用更安全的 fgets() 函數:

#include <stdio.h>

int main() {
char sentence[100];
printf("請輸入一個句子: ");
fgets(sentence, sizeof(sentence), stdin);
printf("你輸入了: %s", sentence);
return 0;
}

fgets() 更安全,因為它允許你指定讀取的最大字符數,幫助防止緩衝區溢出。

使用 puts() 和 fputs() 函數打印字符串

最後,我們來看看一些打印字符串的替代方法:

#include <stdio.h>

int main() {
char greeting[] = "Hello, World!";
puts(greeting);  // puts() 自動添加換行
fputs(greeting, stdout);  // fputs() 不添加換行
return 0;
}

puts() 簡單並自動添加換行,而 fputs() 給你更多的輸出控制。

以下是我們討論過的字符串函數的總結:

函數 目的 示例
scanf() 讀取格式化輸入 scanf("%s", str);
gets() 讀取一行(不安全,避免使用) gets(str);
fgets() 安全地讀取一行 fgets(str, size, stdin);
printf() 打印格式化輸出 printf("%s", str);
puts() 打印字符串並添加換行 puts(str);
fputs() 打印字符串而不添加換行 fputs(str, stdout);

至此,你已經踏上了 C 語言字符串世界的第一步。記住,熟能生巧,所以不要害怕嘗試這些概念。快樂編程,願你的字符串總是正常終止!

Credits: Image by storyset