C言語:構造体

| コメント(1) | トラックバック(0)
続いては構造体について。

異なったデータ型をひとまとめにして扱いたい場合に構造体を利用する。

構造体の宣言は↓のような感じで行う。

struct 構造体タグ {
    メンバ;
    ・・・;
};

↑だけではまだ構造体のテンプレートを宣言しただけで使えない。
実際に使うには構造体タグをを使って構造体変数を宣言する必要がある。

struct data man;
     ↑   ↑
     タグ 変数

構造体テンプレートを宣言するのと同時に、構造体変数を宣言するやり方もある↓。
struct 構造体タグ{
    メンバ;
    ・・・;
} 構造体変数1, 構造体変数2, ・・・;

↑のように同時に宣言する場合は構造体タグを省略することもできる。

構造体のメンバへアクセスするには構造体メンバ演算子「.」を利用する。

構造体変数の配列を作ることも可能。

struct Man student;
と構造体変数を宣言していたところを
struct Man student[5];
とかすればいい。

student[2]のnameメンバにアクセスする場合は
student[2].name でOK。

構造体へのポインタ

構造体変数を

struct Man *student;

のように宣言すると、studentはManへの構造体へのポインタとなる。
このときメンバにアクセスするのは

(*student).name とする。

でも一般的にはアロー演算子を使って
student->name
とする。

新しい型を定義する

typedefキーワードを使えばデータ型の名前を自由に定義することができる。

typedef 既存の型名 新しい型名;

typedef int SEISU; こんな感じで。

上の例では何がうれしいのかあまりわからない・・・。

でも構造体にこのtypedefを適用するとあたかも新しい型ができたかのように見える。

たとえば

typedef struct _tagData {
    int age;
    double bl;
    double bw;
} MYDATA, *LPMYDATA;

とすると_tagData型の構造体変数を定義するとき、

MYDATA mydata;

と書ける。

構造体へのポインタを宣言する場合も
 
LPMYDATA lpmydata;

と宣言できる。



以上のことを踏まえてのサンプルプログラム↓。

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

typedef struct DATA {
        char name[32];
        char tel[32];
} MYDATA, *LPMYDATA;

int menu();
int meibo_input( LPMYDATA );
int meibo_output( LPMYDATA );

int main() {
        int selectno, loopend = 0;

        MYDATA mydata[10];
        LPMYDATA lpMydata = mydata;
        
        memset( mydata, '\0', sizeof(MYDATA[10]) );

        while(1) {
                selectno = menu();

                switch (selectno) {
                        case 1:
                                meibo_input( lpMydata );
                                break;
                        case 2:
                                meibo_output( lpMydata );
                                break;
                        default:
                                loopend = 1;
                                break;
                }
                if( loopend )
                        break;
        }
        return 0;
}

int menu() {
        char ret[8];
        
        printf( "****** MENU ******\n" );
        printf( "1:データ入力\n" );
        printf( "2:データ表示\n" );
        printf( "0:終了\n" );
        printf( "********************\n" );
        printf( "---->" );
        gets(ret);
        return atoi(ret);
}

int meibo_input( LPMYDATA lpData ) {
        char strno[8];
        int no;

        printf( "何番のデータを入力しますか(0-9)--" );
        gets(strno);
        if( strno[0] < '0' || strno[0] > '9' ) {
                printf( "入力が不正です\n" );
                return -1;
        }
        strno[1] = '\0';
        no = atoi(strno);

        printf("氏名--");
        gets( (lpData + no)->name );
        printf( "電話番号--" );
        gets( (lpData + no)->tel );

        return 0;
}

int meibo_output( LPMYDATA lpData ) {
        char strno[8];
        int no;
        
        printf( "何番のデータを読み出しますか(0-9)--" );
        gets( strno );
        
        if(strno[0] < '0' || strno[0] > '9') {
                printf( "入力が不正です\n" );
                return -1;
        }
        strno[1] = '\0';
        no = atoi( strno );

        if(!strcmp( (lpData + no )->name, "" )) {
                printf( "データがありません。\n" );
                return -1;
        }
        printf( "氏名-- %s\n", ( lpData + no )->name );
        printf( "電話番号-- %s\n", (lpData + no)->tel );

        return 0;
}



実行結果
$ ./type03.exe 
****** MENU ******
1:データ入力
2:データ表示
0:終了
********************
---->1
何番のデータを入力しますか(0-9)--3
氏名--test
電話番号--1234567
****** MENU ******
1:データ入力
2:データ表示
0:終了
********************
---->2
何番のデータを読み出しますか(0-9)--3
氏名-- test
電話番号-- 1234567
****** MENU ******
1:データ入力
2:データ表示
0:終了
********************
---->0


もうちょっと色々やってみないとしっくりこないな。


猫でもわかるC言語プログラミング 第2版 猫でもわかるプログラミングシリーズ (NEKO Series)
粂井 康孝
ソフトバンククリエイティブ
売り上げランキング: 30287
おすすめ度の平均: 3.0
3 後半の説明に難あり?
5 猫でもわかるC言語プログラミング
1 猫どころか人間でもわからない
5 実際にコードを書いて覚える本
1 ポインタや配列の説明が内容的に薄いかな。

トラックバック(0)

トラックバックURL: http://www.mogumagu.com/mt/mt-tb.cgi/18

コメント(1)

The Professor will discover that. Just how can they look human? There's no delusion in 1 case or alternatively the other, Miss Middleton.

2012年1月

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

ウェブページ

このブログ記事について

このページは、モグマグが2010年4月30日 23:59に書いたブログ記事です。

ひとつ前のブログ記事は「Google App Engine の Python用開発環境を設定してみる。」です。

次のブログ記事は「GAE Python スタートガイドをやってみる」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 5.01