C言語　構造体とポインタ　実践を意識rev4

[前のコード](https://qiita.com/Banayad/items/4e2fa3843401fdfbb9e4)を変更。
主な変更点は・・
・再編集機能追加
・入力関数を分ける

```c:userinfo.c
#include <stdio.h>     
#include <stdint.h>    

/*********** 定義値 ***********/
#define NAME_SIZE       ( 100 )   
#define AGE_SIZE        (  10 )   
#define ADDRESS_SIZE    ( 100 )    
#define PHONE_SIZE      (  20 )   

/*********** 構造体 ***********/
typedef struct user_info {
	uint8_t  name[NAME_SIZE];
	uint8_t  age[AGE_SIZE];
	uint8_t  address[ADDRESS_SIZE];
	uint8_t  sex;// 0:男　1:女
	uint8_t  phoneNumber[PHONE_SIZE];
}UserInfo;

/*********** 関数宣言 ***********/
void UserInfo_input(void);
void UserInfo_input_name(UserInfo* user);
void UserInfo_input_age(UserInfo* user);
void UserInfo_input_sex(UserInfo* user);
void UserInfo_input_address(UserInfo* user);
void UserInfo_input_phoneNumber(UserInfo* user);
void UserInfo_save(const UserInfo* user);
void UserInfo_ReEdit(void);

/*********** グローバル変数 ***********/
FILE* fp;
UserInfo  user;									//複数人用に拡張する場合はこれを配列にすればいけるか、、？

/*********** 関数定義 ***********/
/* ユーザー情報入出力 */
int main(void) {
	if (fopen_s(&fp, "TBD.txt", "w") != 0) {	//標準入力する前にファイルチェックしておく。
		printf("ファイルアクセス失敗！");
		return 0;
	}
	UserInfo_input();
	UserInfo_ReEdit();
	UserInfo_save(&user);
	fclose(fp);
	return 0;
}

/* ユーザー情報（ALL）入力 */
void UserInfo_input(void) {
	UserInfo_input_name(&user);
	UserInfo_input_age(&user);
	UserInfo_input_sex(&user);
	UserInfo_input_address(&user);
	UserInfo_input_phoneNumber(&user);
}

/* ユーザー情報（名前）入力 */
void UserInfo_input_name(UserInfo* user) {
	uint8_t i = 0;
	printf("\n名前を入力してください->");
	while ('\n' != (user->name[i] = getchar())) { i++; } 
	user->name[i] = '\0';	//入力の最後に\0(NULL)を入れる。なくても\n以降、たまたま\0埋めされてたが不定なので危険。
}

/* ユーザー情報（年齢）入力 */
void UserInfo_input_age(UserInfo* user) {
	uint8_t i = 0;
	printf("\n年齢を入力してください->");
	while ('\n' != (user->age[i] = getchar())) { i++; }
	user->age[i] = '\0';	//入力の最後に\0(NULL)を入れる。なくても\n以降、たまたま\0埋めされてたが不定なので危険。
}

/* ユーザー情報（性別）入力 */
void UserInfo_input_sex(UserInfo* user) {
	uint8_t uc_ReInputFlg = 1;
	uint8_t uc_buff[10];
	 do{
		printf("\n性別を選択してください[0:男性 1:女性]->");
		scanf_s("%s%*c", uc_buff, sizeof(uc_buff));//%*cで改行コード\nを捨てる。捨ててないと2回目\nがきた
		if ((uc_buff[0] == '0')&& (uc_buff[1] == '\0') ){
			user->sex = 0;
			uc_ReInputFlg = 0;
		}
		else if ((uc_buff[0] == '1') && (uc_buff[1] == '\0')) {
			user->sex = 1;
			uc_ReInputFlg = 0;
		}
		else {
			printf("\n無効な文字です(半角でお願いします)");
		}
	 } while (uc_ReInputFlg);
}

/* ユーザー情報（住所）入力 */
void UserInfo_input_address(UserInfo* user) {
	uint8_t i = 0;
	printf("\n住所を入力してください->");
	while ('\n' != (user->address[i] = getchar())) { i++; }
	user->address[i] = '\0';	//入力の最後に\0(NULL)を入れる。なくても\n以降、たまたま\0埋めされてたが不定なので危険。
}

/* ユーザー情報（電話番号）入力 */
void UserInfo_input_phoneNumber(UserInfo* user) {
	uint8_t i = 0;
	printf("\n電話番号を入力してください->");
	while ('\n' != (user->phoneNumber[i] = getchar())) { i++; }
	user->phoneNumber[i] = '\0';	//入力の最後に\0(NULL)を入れる。なくても\n以降、たまたま\0埋めされてたが不定なので危険。
}

/* ユーザー情報再編集 */
void UserInfo_ReEdit(void) {
	uint8_t uc_buff[10];
	uint8_t uc_sts = 1;

	while (uc_sts) {
		printf("\n確定しますか？ \
			\n[0:確定 1:名前再入力 2:年齢再入力 3:性別再入力 4:住所再入力 5:電話番号再入力]->");
		scanf_s("%s%*c", uc_buff, sizeof(uc_buff));//%*cで改行コード\nを捨てる。捨ててないと2回目\nがきた
		switch (uc_buff[0]) {
		case ('0'): uc_sts = 0; break;
		case ('1'):	UserInfo_input_name(&user); break;
		case ('2'): UserInfo_input_age(&user); break;
		case ('3'):	UserInfo_input_sex(&user); break;
		case ('4'):	UserInfo_input_address(&user); break;
		case ('5'):	UserInfo_input_phoneNumber(&user); break;
		default:    printf("無効な文字です(半角でお願いします)"); break;
		}
	}
}

/* ユーザー情報出力（テキスト） */
void UserInfo_save(const UserInfo* user) { 

	fprintf_s(fp, "【名前】\n%s\n", user->name);
	fprintf_s(fp, "【年齢】\n%s\n", user->age);
	if (user->sex == 0)fprintf_s(fp, "【性別】\n男性\n\n");
	else			   fprintf_s(fp, "【性別】\n女性\n\n");
	fprintf_s(fp, "【住所】\n%s\n", user->address);
	fprintf_s(fp, "【電話番号】\n%s\n", user->phoneNumber);
}



```
動作確認

![UserInfo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450697/1d83c8cc-04e3-adc8-dd4e-3a4eef5b790f.gif)