發信人: ax.bbs@bbs.ee.nthu.edu.tw. (athena), 信區: test
標  題: 星星流講座 0009
發信站: ☆清華電機☆ (Sun May  7 02:24:22 1995)
轉信站: star

星星流講座 0009         C 語言教室

第 3 講 之 2            陣列與字串
                        Topic: Concept of String -- Character array

前面談到 C 語言使用 char 這個型別來存放字元,一個字元只能放一個
英文字,這對實際上的需求來說是不夠的。我們常常需要儲存一個字 (word)
而非一個字元 (character),這個時候就必須找找有沒有處理字串的功能
了。

C 語言並沒有字串這種資料型態,它把字串看成是字元陣列。什麼是陣列
(array) 呢?我們以下面的圖來說明:

        char a;
                ┌┐
                └┘                    <---- 只能放一個字元

        char a[10];
                ┌┬┬┬┬┬┬┬┬┬┐  <---- 可以放十個字元
                └┴┴┴┴┴┴┴┴┴┘
 

一個基本型態的變數,一次只能存一筆資料。陣列型態的變數就不同了,
它一次可以存很多筆資料,而且這些資料是循序地放置在陣列之中,由
第 0 個開始算起
。C 把字串看成是字元陣列,因為字串就是字元依序
排列的結果,恰好可以利用字元陣列來達成,日後你會發現這個設計是非
常巧妙而有用的。

陣列的宣告是如 char a[10]; 這種型式,變數名字後面緊接著中括號,這
個中括號叫做「註標」,註標內括的數字就是這個陣列的大小,例如 a[10]
就是由 a[0] 到 a[9] 一共 10 個元素。我們可以用像 a[0] 這種形式取出
陣列中某一個特定的元素,就好像使用一般基本型態的變數一樣。

在 C 語言中,字串在字元陣列中的排列是像下圖這種樣子:

      a[0] a[1] a[2] a[3] a[4] a[5]
        ┌─┬─┬─┬─┬─┬─┐
        │H │e │l │l │o │\0│
        └─┴─┴─┴─┴─┴─┘
 

像 Hello 一共有五個字元,就存放於陣列中第 0 個到第 5 個的位置,最後
加上 \0 做為結束。前面已經提過逸出序列的用法,\0 是代表 ASCII 碼為 0
的字元,它的意義就是 NULL (空字元),C 語言中以 \0 代表一個字串的結
尾,每個字串的最後都必須以一個 \0 代表字串結束
。由於必須加上 \0 的
關係,所以每個字串必須配置一個比它的字元長度多 1 的陣列來存放才不會
產生錯誤,例如 Hello 一共五個字元,則我們必須配置一個 char a[6]; 的
陣列才能儲存它。

那麼我要怎麼給定字串的初值呢?以下是一個最常見的錯誤

        char a[6];
        a = "Hello";

這種做法是錯誤的,字串不能以這種方式給定初值,如果要給定字串的初值,
必須照像下面範例程式的作法:

/* initstring.c */
#include <stdio.h>
#include <string.h>

main ()
{
    char a[6];
    strcpy (a, "Hello");
    printf ("%s\n", a);
}

執行結果:

Hello

你必須 #include <string.h>,然後使用 strcpy 這個函數來給定字串的初
值,字串是以雙括號 " 括起來的,和括字元用的單括號 ' 不同。程式中
printf 的參數 %s 是用來顯示字串用的。