NekoC

猫でもわかるC言語の個人的なまとめ資料

View on GitHub

09_構造体2.md

typedef演算子


typedef struct _tagData {
	int age;
	double height;
	double weight;
} MYDATA, *LPMYDATA

MYDATA mydata;

/* ポインタを宣言する際にも*が不要なことに注意*/
LPMYDATA lpmydata;

atoi関数


int atoi(
		const char *string
		)

atof関数


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 menu(){
	char mode[8];
	printf("**** モード選択 ****\n"
	"1. 名簿入力\n"
	"2. 名簿出力\n"
	"0. 終了\n"
	"***************\n\n"
	"---------> "
	);
	gets_s(mode);
	return atoi(mode);
}


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