iT邦幫忙

2

【從零開始的 C 語言筆記】第二十八篇-Struct的介紹與應用

Alicia 2021-12-02 22:57:3620379 瀏覽
  • 分享至 

  • xImage
  •  

上一篇結束後我們就介紹了完整的變數生命週期了,也提到了區域變數、全域變數、自動變數、靜態變數的概念,對於寫程式來說搞懂變數的作用域是很重要的事情喔!

今天我們來介紹變數的組合技--「Struct」!


什麼是Struct?

到現在我們已經把單一變數的各種型態、作用域都介紹完成了,今天我們要來提到的是Struct(結構),Struct是一種自訂的資料型態,可以把不同的基本資料型態(int.float.double.char)變數組合,形成新的資料型態。

也許這樣說起來有一點籠統,不如我們來看下面的程式碼:

#include <stdio.h>
#include <string.h>

struct students{
    int id;
    char name[20];
    int chinese;
    int english;
    int math;
    int social;
    int science;
};

int main()
{
    struct students one;
    
    one.id = 1;
    strcpy(one.name, "張小美");
    one.chinese = 77;
    one.english = 83;
    one.math = 86;
    one.social = 68;
    one.science = 91;

    printf("學生編號: %d\n", one.id);
    printf("姓名: %s\n", one.name);
    printf("國文成績: %d\n", one.chinese);
    printf("英文成績: %d\n", one.english);
    printf("數學成績: %d\n", one.math);
    printf("社會成績: %d\n", one.social);
    printf("自然成績: %d\n", one.science);

    return 0;
}

https://ithelp.ithome.com.tw/upload/images/20211202/20142565EOiy65ub9z.png
可以看到在主函式外宣告了一個名為students的struct,而這個students中包含了int.char這些資料型態的變數,又與之前我們提過的陣列,都是同資料型態的樣子大不相同。

struct比較像是為了描述某個資料而自訂出來的,而為此我們會組合許多不同變數,如同資料表中會有許多不同欄位,但都是為了描述一筆一筆的資料而生。


正式使用

  1. struct定義的種類

(1) 純粹定義struct

struct students{
    int id;
    char name[20];
    int chinese;
    int english;
    int math;
    int social;
    int science;
};

https://ithelp.ithome.com.tw/upload/images/20211202/20142565AjKBh5TBDp.png
日後需使用struct時的變數宣告:

struct students someone;

(2) 定義struct的同時宣告變數

struct students{
    int id;
    char name[20];
    int chinese;
    int english;
    int math;
    int social;
    int science;
}someone;

https://ithelp.ithome.com.tw/upload/images/20211202/20142565jCaqOFzUlR.png
日後使用時直接使用這個,已經被宣告好的變數someone就可以了。

(3) 定義struct也宣告struct別名

struct students{
    int id;
    char name[20];
    int chinese;
    int english;
    int math;
    int social;
    int science;
}
typedef struct students Student;

https://ithelp.ithome.com.tw/upload/images/20211202/20142565Vyz3CYqBmc.png
這樣我們就替這個新struct取好Student的別名了,日後使用時的變數宣告會變為:

Student someone;

(4) 在定義struct時直接取別名

typedef struct{
    int id;
    char name[20];
    int chinese;
    int english;
    int math;
    int social;
    int science;
}Student;

https://ithelp.ithome.com.tw/upload/images/20211202/20142565dbKw99tQk3.png
日後的變數宣告:

Student someone;

(延伸閱讀:李山姆的部落格-typedef struct用法說明)

  1. struct的使用
    當我們要使用struct時,除了一樣要進行變數宣告外,我們要使用struct的成員時的用法,也與陣列有極大的不同。

(1) 變數宣告
與一般的變數宣告一樣,都是採取「資料型態 變數名稱;」的形式
(a) 無別名也未在結構宣告時同時宣告變數

struct students{
    int id;
    char name[20];
    int chinese;
    int english;
    int math;
    int social;
    int science;
};

struct students someone;

https://ithelp.ithome.com.tw/upload/images/20211202/20142565ycYNQEdJWj.png

(b) 已定義別名

typedef struct {
    int id;
    char name[20];
    int chinese;
    int english;
    int math;
    int social;
    int science;
}Student;

Student someone;

https://ithelp.ithome.com.tw/upload/images/20211202/20142565xh0ihY6PtC.png

(2) 取得、變更變數成員

one.id = 1;
printf("學生編號: %d\n", one.id);

https://ithelp.ithome.com.tw/upload/images/20211202/2014256568TSnTauXO.png

  1. 實際應用
#include <stdio.h>
#include <string.h>

struct staffs{
    int id;
    char name[20];
    char gender;
    int age;
    char address[50];
};

int main()
{
    struct staffs no1;
    no1.id = 1;
    strcpy(no1.name, "王小明");
    no1.gender = 'm';
    no1.age = 23;
    strcpy(no1.address, "xx市xx區xx里xx路xx號x樓");

    struct staffs no2;
    no2.id = 2;
    strcpy(no2.name, "葉花花");
    no2.gender = 'w';
    no2.age = 26;
    strcpy(no2.address, "oo市oo區oo里oo路o號o樓");

    printf("---列印員工資料---\n\n");

    printf("員工編號: %d\n", no1.id);
    printf("姓名: %s\n", no1.name);
    printf("性別: ");
    if(no1.gender == 'm'){
        printf("男\n");
    }
    else if(no1.gender == 'w'){
        printf("女\n");
    }
    else{
        printf("不詳\n");
    }
    printf("年紀: %d\n", no1.age);
    printf("地址: %s\n", no1.address);

    printf("---列印員工資料---\n\n");

    printf("員工編號: %d\n", no2.id);
    printf("姓名: %s\n", no2.name);
    printf("性別: ");
    if(no2.gender == 'm'){
        printf("男\n");
    }
    else if(no2.gender == 'w'){
        printf("女\n");
    }
    else{
        printf("不詳\n");
    }
    printf("年紀: %d\n", no2.age);
    printf("地址: %s\n", no2.address);

    return 0;
}

https://ithelp.ithome.com.tw/upload/images/20211202/2014256544nqVV3bg2.png


小結

  1. struct可以包含許多不同資料型態的成員。

  2. 在進行struct定義後,仍需進行變數宣告才可以使用。

  3. 在進行結構的變數宣告時,要注意資料型態是什麼、有沒有取別名。


看到這裡就大致介紹完struct了,不曉得大家有沒有辦法吸收進去呢?內容有使用到第十五篇介紹的string函式庫,大家如果有不了解的地方,可以多多嘗試或查其他資料!

下一篇我們來介紹c語言怎麼進行讀檔、寫檔!


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言