C 語言初學教材 - 第二章 向使用者 Say Hello!

現在我們來寫個向使用者 Say Hello! 的程式吧!



之前我們直接印出歡迎訊息,有關暱稱的部份使用預設的字串,也就是 "kaiching" ,現在我們則是要利用函數 scanf() 接受使用者輸入他們自己的暱稱。程式如下
#include <stdio.h>

int main(void)
{
    int month, day, hour, min;
    char name[10];
    
    month = 7;
    day = 27;
    hour = 9;
    min = 45;
    
    printf("請輸入您的暱稱: ");
    scanf("%s", name);
    
    printf("\n\n今天是 %d 月 %d 日\n", month, day);
    printf("現在是上午 %d:%d\n", hour, min);
    printf("哈囉, %s!\n\n", name);
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:sayhello1.c
    功能:向使用者 Say Hello!
    作者:張凱慶
    時間:西元2010年7月 */


先來編譯執行看看吧!



程式的第 6 行
char name[10];


我們宣告了一個字元陣列, C 語言中的陣列是同質的資料結構,意思是說陣列中可以有多筆相同型態的資料,因此字元陣列就是一群字元型態資料的集合體。如果直接指派字串給字元陣列,例如
char name[10] = "kaiching";


此字元陣列中就會儲存字串 "kaiching" 的值,圖示如下



陣列裡儲存的單筆資料稱為元素,我們可以利用陣列名稱加上中括弧,中括弧內為陣列元素的索引值來個別存取陣列元素。陣列名稱亦為指標,因此陣列名稱 name 就是指向 name[0] 的記憶體位址。


這裡我們須注意一點,若是使用指向字元的指標,可以指向某個常數字串,因為使用常數字串,編譯器會直接給該常數字串在記憶體中保留空間,所以指向字元的指標指向常數字串,就等於指向該字串第一個元素的記憶體位址。然而這裡我們接受使用者輸入字串,需要先告訴編譯器要先保留多少空間出來,所以宣告陣列時,中括弧就得同時設置所宣告陣列的元素個數。


上例中也可以看出,若是字串裡的字元數少於字元陣列所宣告的元素數量,字元陣列沒有被給值的元素都會填入 '\0' ,這是 ASCII 中的空字元,等同於整數 0 。


除了字元陣列外,陣列可以宣告成任何的資料型態。例如,以下例子簡單示範整數陣列的使用
#include <stdio.h>

int main(void)
{
    int number[5] = {1, 2, 3, 4, 5};
    
    printf("倒數計時開始.....\n");
    printf("%d\n", number[4]);
    printf("%d\n", number[3]);
    printf("%d\n", number[2]);
    printf("%d\n", number[1]);
    printf("%d\n", number[0]);
    printf("倒數計時完畢,程式結束\n");
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:intarray.c
    功能:示範整數陣列的使用
    作者:張凱慶
    時間:西元2010年7月 */


編譯後執行,如下



第 5 行
int number[5] = {1, 2, 3, 4, 5};


這是宣告陣列同時指派初值的方式,指派陣列的值必須用大括弧圍起來。如果是字串可用這樣
char *name = "kaiching";


也可以照字元陣列的方法,如
char name[] = {'k', 'a', 'i', 'c', 'h', 'i', 'n', 'g'};


附帶一提,若是陣列宣告同時指派初值,中括弧可留空白,編譯器會自動計算並且配置元素個數。


問題與討論
  1. 什麼是同質的資料結構?什麼又是異質的資料結構?
  2. 為什麼陣列的索引要從 0 開始,有什麼優點嗎?
  3. 陣列與指標有什麼關係?
  4. 嘗試先宣告一個中括弧留空的整數陣列,然後再另一行指派給值,試看看能否順利編譯。




沒有留言: