09_構造体2.md
typedef
演算子
- データ型の名前を定義することができる。
- 書式
- 下記のようにも書くことができる
typedef struct _tagData {
int age;
double height;
double weight;
} MYDATA, *LPMYDATA
MYDATA mydata;
/* ポインタを宣言する際にも*が不要なことに注意*/
LPMYDATA lpmydata;
atoi関数
- Ascii to Integer
- 文字列を整数に変換する。
int atoi(
const char *string
)
atof関数
- Ascii to Float
- 文字列を浮動小数点数に変換する。
int atof(
const char *string
)
サンプルコード
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*構造体の宣言*/
typedef struct {
char name[32];
char tel[32];
}MYDATA, *LPMYDATA;
/*プロトタイプ宣言*/
int menu();
int rosterInput(LPMYDATA);
int rosterOutput(LPMYDATA);
int main(){
int mode, repeatFlg = 1;
/*データの初期化*/
MYDATA mydata = { "", "" };
/*ポインタの初期化*/
LPMYDATA lpMyData = &mydata;
do {
mode = menu();
switch (mode){
case 1:
rosterInput(lpMyData);
break;
case 2:
rosterOutput(lpMyData);
break;
default:
repeatFlg = 0;
break;
}
} while (repeatFlg);
system("pause");
return 0;
}
int menu(){
char ret[8];
printf_s("\n***** MENU *****\n");
printf_s("1: データ入力\n");
printf_s("2: データ表示\n");
printf_s("0: 終了\n");
printf_s("***************\n");
printf_s("-----> ");
gets_s(ret);
return atoi(ret);
}
int rosterInput(LPMYDATA lpData){
printf_s("氏名--");
gets_s(lpData->name);
printf_s("電話番号--");
gets_s(lpData->tel);
return 0;
}
int rosterOutput(LPMYDATA lpData){
if (!strcmp(lpData->name, "")) {
printf("データがありません\n");
return -1;
}
printf_s("氏名 -- %s\n", lpData->name);
printf_s("電話番号 -- %s\n", lpData->tel);
return 0;
}
出力結果
***** MENU *****
1: データ入力
2: データ表示
0: 終了
***************
-----> 1
氏名--Kosuke
電話番号--Konishi
***** MENU *****
1: データ入力
2: データ表示
0: 終了
***************
-----> 2
氏名 -- Kosuke
電話番号 -- Konishi
***** MENU *****
1: データ入力
2: データ表示
0: 終了
***************
-----> 0
続行するには何かキーを押してください . . .
サンプルコード2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*構造体の宣言*/
typedef struct{
char name[32];
char sex[8];
}MYDATA, *LPMYDATA;
/*プロトタイプ宣言*/
int menu();
int rosterInput(LPMYDATA);
int rosterOutput(LPMYDATA);
int main(){
int mode, repeatFlg = 1;
/*配列 -> 連続するメモリの確保の最初のアドレス*/
MYDATA mydata[10];
LPMYDATA lpMyData = mydata;
/*構造体の配列の初期化*/
memset(mydata, '\0', sizeof(MYDATA[10]));
do{
mode = menu();
switch (mode){
case 1:
rosterInput(lpMyData);
break;
case 2:
rosterOutput(lpMyData);
break;
default:
repeatFlg = 0;
break;
}
} while (repeatFlg);
}
int rosterInput(LPMYDATA lpData){
char strNo[8];
int no;
printf("何番のデータを入力しますか(0-9)--");
gets_s(strNo);
if (strNo[0] < '0' || strNo[0] > '9'){
printf("入力が不正です。\n\n");
return -1;
}
strNo[1] = '\0';
no = atoi(strNo);
printf("氏名--");
gets_s((lpData + no)->name);
printf("性別--");
gets_s((lpData + no)->sex);
return 0;
}
int rosterOutput(LPMYDATA lpData){
char strNo[8];
int no;
printf("何番のデータを読み出しますか?(0-9)--");
gets_s(strNo);
if (strNo[0] < '0' || strNo[0] > '9') {
printf("入力が不正です。\n\n");
return -1;
}
strNo[1] = '\0';
no = atoi(strNo);
if (!strcmp((lpData + no)->name, "")){
printf("データがありません。\n\n");
return -1;
}
printf("氏名-- %s\n", (lpData + no)->name);
printf("性別-- %s\n\n", (lpData + no)->sex);
return 0;
}
出力結果
**** モード選択 ****
1. 名簿入力
2. 名簿出力
0. 終了
***************
---------> 1
何番のデータを入力しますか(0-9)--1
氏名--Kosuke
性別--male
**** モード選択 ****
1. 名簿入力
2. 名簿出力
0. 終了
***************
---------> 1
何番のデータを入力しますか(0-9)--2
氏名--Mary
性別--female
**** モード選択 ****
1. 名簿入力
2. 名簿出力
0. 終了
***************
---------> 2
何番のデータを読み出しますか?(0-9)--1
氏名-- Kosuke
性別-- male
**** モード選択 ****
1. 名簿入力
2. 名簿出力
0. 終了
***************
---------> 0