Skip to content

C 式字串 (C-Style String)

C 式字串即是字元陣列,相較一般陣列,字元陣列有一些獨有的用法,以下來介紹:

注意

這裡是指 C 式字串(字元陣列),不是 C++ 的 STL 容器 String

宣告

C 式字串是陣列,所有陣列宣告方法也適用在 C 式字串,唯要注意最後要給一個 \0 ,表示字串結尾。C 式字串可以不給大小(長度),此外,也可以用字串常數宣告,使用字串常數宣告,不用在後面加上 \0 ,但程式自動會補 \0

1
2
3
4
char str1[6];
char str2[6] = {'a', 'p', 'p', 'l', 'e', '\0'};
char str3[] = {'a', 'p', 'p', 'l', 'e', '\0'};
char str4[] = "apple";

輸入輸出

C 式字串可以一個字元一個字元慢慢輸入,也可以一次輸入整個字串。:

scanf 會輸入直到遇見換行字元,輸入的長度有可能大於變數長度,可能造成安全上的疑慮(程式競賽中給的資料都是有長度限制,沒有這個問題), scanf 可以設定 width 來控制輸入長度。

輸出用 printfprintf 會一直輸出,直到遇見 \0

1
2
3
scanf("%s", str1);  // 不安全,但在程式競賽上 OK
scanf("%9s", str1); // 比較安全的寫法
printf("%s\n", str1);

字典序

字典序是指按照單詞出現在字典的順序進行排序的方法1,可用來規範字串之間的順序。兩個相異字串間的字典序比較:

  • 從第 個字元開始比對。
    • 如果字元相同,比較下一個字元。
    • 否則轉換成 ASCII 編號,比較編號大小,編號小的字典序較小。
    • 如果遇到其中一方字串已經比較完所有字元,則字串長度較短者,其字典序較小。
  • 在第 個字元 ,因此
  • 在第 個字元 ,因此
  • 前第 個字元都相等,因為 已經比較完所有字元,因此

Scan Set

Scan Set 可以設定字串輸入只包含哪些字元,主要用於輸入格式較複雜的題目。舉例如下:

  • %[abc]s :輸入包含 abc 的字串
  • %[^abc]s :輸入不包含 abc 的字串
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
scanf("%[abc]s", s);
printf("%s\n", s);

/*
輸入:abcdef
輸出:abc
*/

scanf("%[^abc]s", s);
printf("%s\n", s);

/*
輸入:fedcba
輸出:cba
*/