LoginSignup
0
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-10-12

前のコードを変更。
主な変更点は・・
・再編集機能追加
・入力関数を分ける

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

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0