字串(字元陣列)


在 C 中字串的本質是由字元所組成的陣列,並在最後加上一個空(null)字元 '\0',例如下面這個程式就是一個 "hello" 字串的宣告:

char text[] = {'h', 'e', 'l', 'l', 'o', '\0'};

之後可以直接使用 text 來代表該字串,例如在文字模式下輸出 text 字串:

printf(text);
printf("%s\n", text);

C 是使用空字元來識別一個字元陣列是否表示字串,像上例就可以用來表示一個字串 "hello",在 C 中也可以這麼宣告字串:

char text[] = "hello";

在這個例子中,雖然您沒有指定空字元 '\0',但是程式會自動加上空字元,而基本上還是字元陣列,與前一個宣告方式是相同的,從下面這個程式就可以知道:

#include <stdio.h>

int main(void) {
    char text[] = "hello";
    int length = sizeof(text) / sizeof(text[0]);

    for(int i = 0; i < length; i++) {
        if(text[i] == '\0') {
            puts("null");
        } else {
            printf("%c ", text[i]);
        }
    }
    putchar('\n');

    return 0;
}

執行結 果:

h e l l o null

字串是字元陣列,可以使用陣列的存取方式取出每一個字元,在指定 "hello" 時表面上雖然只有 5 個字元, 但是最後會加上一個空字元 '\0',所以 text[] 共使用了6個字元,由於字串的最後一個字元為空字元,可以檢驗這個字元來看看字串是否為空,例如:

if(text[0] == '\0') {
    puts("字串為空");
}

空字元在作條件判斷時,會被視為 0,所以上式還可以這麼寫:

if(!text[0]) {
    puts ("字串為空");
}

由使用者輸入取得字串值時,需注意不要超過字串(字元陣列)的長度;使用 scanf() 從使用者輸入取得字串值,並儲存至字元陣列,只要這麼作就可以了:

char str[80];
printf("輸入字串:");
scanf("%s", str);
printf("您輸入的字串為 %s\n", str);

這個程式片段可以取得使用者的字串輸入,所輸入的字串長度不得超過 80 個字元,8 0個字元的上限包括空白字元,所以實際上可以輸入 79 個字元;如果輸入的字元超出所宣告的上限,會發生不可預期的錯誤。

在使用 scanf() 取得使用者輸入的字串時,格式指定字是使用 %s,而變數前不用再加上 &,因為實際上,字串(字元陣列)變數名稱本身,即表示記憶體位址資訊。

要指定新的字串值給它時,您不能像下面的方式指定:

char name[80]; 
name = "Justin";

而必須要一個字元一個字元的指定至陣列中,並在最後加上空白字元,例如:

char name[80] = {'\0'}; 
name[0] = 'J'; 
name[1] = 'u'; 
name[2] = 's'; 
name[3] = 't'; 
name[4] = 'i';
name[5] = 'n';
name[6] = '\0'; 
puts(str);

這樣的字元指定方式當然相當的不方便,所以 C 提供了字串處理的相關函式,可以協助您進行一些字串 處理,在之後的主題還會說明。

字串的宣告還有指標(Pointer)的宣告方式,這個留待談到指標時再來說明。