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