前のコードを変更。
主な変更点は・・
・再編集機能追加
・入力関数を分ける
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);
}
動作確認