一個結構體變數可以存放一個學生的一組資訊,可是如果有 10 個學生呢?難道要定義 10 個結構體變數嗎?難道上面的程式要複製和貼上 10 次嗎?
很明顯不可能,這時就要使用陣列。結構體中也有陣列,稱為
結構體陣列。它與前面講的數值型陣列幾乎是一模一樣的,只不過需要注意的是,結構體陣列的每一個元素都是一個結構體型別的變數,都包含結構體中所有的成員項。
定義結構體陣列的方法很簡單,同定義結構體變數是一樣的,只不過將變數改成陣列。或者說同前面介紹的普通陣列的定義是一模一樣的,如:
struct STUDENT stu[10];
這就定義了一個結構體陣列,共有 10 個元素,每個元素都是一個結構體變數,都包含所有的結構體成員。
結構體陣列的參照與參照一個結構體變數在原理上是一樣的。只不過結構體陣列中有多個結構體變數,我們只需利用 for 循 環一個一個地使用結構體陣列中的元素。
下面編寫一個程式,程式設計要求:從鍵盤輸入 5 個學生的基本資訊,如姓名、年齡、性別、學號,然後將學號最大的學生的基本資訊輸出到螢幕。
# include <stdio.h>
# include <string.h>
struct STU
{
char name[20];
int age;
char sex;
char num[20];
};
void OutputSTU(struct STU stu[5]); //函數宣告, 該函數的功能是輸出學號最大的學生資訊
int main(void)
{
int i;
struct STU stu[5];
for (i=0; i<5; ++i)
{
printf("請輸入第%d個學生的資訊:", i+1);
scanf ("%s%d %c%s", stu[i].name, &stu[i].age, &stu[i].sex, stu[i].num);/*%c前面要加空格, 不然輸入時會將空格賦給%c*/
}
OutputSTU(stu);
return 0;
}
void OutputSTU(struct STU stu[5])
{
struct STU stumax = stu[0];
int j;
for (j=1; j<5; ++j)
{
if (strcmp(stumax.num, stu[j].num) < 0) //strcmp函數的使用
{
stumax = stu[j];
}
}
printf("學生姓名:%s 學生年齡:%d 學生性別:%c 學生學號:%sn", stumax.name, stumax.age, stumax.sex, stumax.num);
}
輸出結果是:
請輸入第1個學生的資訊:小紅 22 F Z1207031
請輸入第2個學生的資訊:小明 21 M Z1207035
請輸入第3個學生的資訊:小七 23 F Z1207022
請輸入第4個學生的資訊:小欣 20 F Z1207015
請輸入第5個學生的資訊:小天 19 M Z1207024
學生姓名:小明 學生年齡:21 學生性別:M 學生學號:Z1207035
結構體陣列定義時初始化
結構體陣列的初始化與前面講的數值型陣列的初始化是一模一樣的,數值型陣列初始化的方法和需要注意的問題在結構體陣列的初始化中同樣適用,因為不管是數值型陣列還是結構體陣列都是陣列。下面就將前面的一個程式修改一下。
# include <stdio.h>
# include <string.h>
struct STU
{
char name[20];
int age;
char sex;
char num[20];
};
void OutputSTU(struct STU stu[5]); //函數宣告
int main(void)
{
struct STU stu[5] = {{"小紅", 22, 'F', "Z1207031"}, {"小明", 21, 'M', "Z1207035"}, {"小七", 23, 'F', "Z1207022"}, {"小欣", 20, 'F', "Z1207015"}, {"小天", 19, 'M', "Z1207024"}};
OutputSTU(stu);
return 0;
}
void OutputSTU(struct STU stu[5])
{
struct STU stumax = stu[0];
int j;
for (j=1; j<5; ++j)
{
if (strcmp(stumax.num, stu[j].num) < 0)
{
stumax = stu[j];
}
}
printf("學生姓名:%s 學生年齡:%d 學生性別:%c 學生學號:%sn", stumax.name, stumax.age, stumax.sex, stumax.num);
}
輸出結果是:
學生姓名:小明 學生年齡:21 學生性別:M 學生學號:Z1207035
注意,字元要用單引號括起來,字串要用雙引號括起來。