之前我們直接印出歡迎訊息,有關暱稱的部份使用預設的字串,也就是 "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'};
附帶一提,若是陣列宣告同時指派初值,中括弧可留空白,編譯器會自動計算並且配置元素個數。
問題與討論
- 什麼是同質的資料結構?什麼又是異質的資料結構?
- 為什麼陣列的索引要從 0 開始,有什麼優點嗎?
- 陣列與指標有什麼關係?
- 嘗試先宣告一個中括弧留空的整數陣列,然後再另一行指派給值,試看看能否順利編譯。
沒有留言:
張貼留言