字串 (String)

C 並沒有一個稱作「字串」的資料型態,但是它卻有一個稱作「字串」的輸出格式。 C 語言有一個隱喻 (imply) 的字串 (string) 資料型態,就是

String:   以 '\0' 字元作為結束符號的 char 序列
以下是個利用字串輸出格式的例子。
#include <stdio.h>

/* 示範 %s 輸出格式  (printf-string.c) */
main() {
    char h[14];
    h[0]='h'; h[1]='e'; h[2]=h[3]=h[10]='l';
    h[4]=h[8]='o'; h[5]=','; h[6]=' ';
    h[7]='w'; h[9]='r'; h[11]='d'; h[12]='.';
    h[14]='\0';
    
    printf("%s\n", h);
    return 0;
}

注意,當我們定義 h[] 的值,在最後放了一個 '\0'。 它是「零字元」,亦即 ASCII 零號,它不是 '0',請勿攪糊塗了。 其實,我們也可以寫
h[14]=0;
但是還是建議大家寫
h[14]='\0';
因為後者的意義更為明顯:代表一個字串的結束。

讀者可以看到,若 h[] 定義了一個字串, 則 printf() 可以用比較簡潔的語法來輸出這個字串。

C 語言將放在一對 "   " 內的字元, 視為一個常數字串 (string constant)。 就好像 35 是一個常數一樣。 例如 "hello" 是一個常數字串,它是由

'h'   'e'   'l'   'l'   'o'   '\0'
六個字元所組成。注意最後有一個零字元。因此,
'c'   和   "c"
是不一樣的。'c' 是一個字元,但是 "c" 有兩個字元:
"c"   代表 'c' 和 '\0' 組成的 char 序列

我們可以直接用常數來定義一個變數的值,例如說

int n;
n = 35;
但是,常數字串是一個序列,而序列之間是不能直接用 = 號來做設定的。 所以,我們不能說
char s[6];
s = "hello";
那麼,豈不是每次要定義一個字串的時候,都要一個字元一個字元地定義嗎? 也不至於這麼麻煩,但是我們保留這個問題到稍後再談。

在這一節的範例中,我們宣告 h[] 的維度與 "hello, world." 的長度相同 (含零字元)。一般而言,這是不必要的。 字串的長度 (含零字元),只要不超過儲存它的 char 序列維度即可。

習題

  1. 請問 "This is a book." 是由幾個字元組成的字串?
  2. 試想,如果忘記在 char 序列中寫一個零字元來結尾, 而以 printf()%s 格式來輸出那個字串,後果會如何?

[ 前一節 ]‧[ 後一節 ]‧[ 回目錄 ]



注意:此處所有文件均為原著,個別的版權宣告日後會一一公布, 整體版面設計亦尚未完成。但仍請勿抄襲文字與圖片,以免觸犯著作權法。

Created: Apr 4, 2000
Last Revised: Apr 4, 2000
© Copyright 2000 Wei-Chang Shann 單維彰

shann@math.ncu.edu.tw