Menu
Coddy logo textTech

連絡先を作成する関数

CoddyのCジャーニー「Logic & Flow」セクションの一部。レッスン 51/63。

challenge icon

チャレンジ

簡単

前のレッスンで作成した Contact 構造体を基に、新しい連絡先のメモリを動的に割り当てる関数を作成してください。プログラムでは次のことを行います。

  1. 前のレッスンと同じ Contact 構造体の定義を使用し、次のメンバーを含めます。
    • サイズ 50 の文字配列 name
    • サイズ 20 の文字配列 phone
    • サイズ 40 の文字配列 email
    • 整数型の age
  2. createContact という名前の関数を作成し、次の処理を行います。
    • パラメーターを受け取らない
    • Contact 構造体へのポインターを返す
    • malloc() を使用して、1 つの Contact 構造体用のメモリを動的に割り当てる
    • メモリの割り当てが成功したか確認する:
      • 割り当てに失敗した場合(NULL を返す場合)、Memory allocation failed を出力して NULL を返す
      • 割り当てに成功した場合、Contact created successfully を出力する
    • 矢印演算子を使用して、すべての構造体メンバーを Default 値で初期化する:
      • namecontactPtr->name[0] = '\0'; を使用して空の文字列に設定する
      • phonecontactPtr->phone[0] = '\0'; を使用して空の文字列に設定する
      • emailcontactPtr->email[0] = '\0'; を使用して空の文字列に設定する
      • agecontactPtr->age = 0; を使用して 0 に設定する
    • 新しく作成した連絡先へのポインターを返す
  3. main 関数では次の処理を行います。
    • newContact という名前の Contact 構造体へのポインターを宣言する
    • createContact 関数を呼び出し、返されたポインターを newContact に代入する
    • 連絡先の作成に成功したか確認する:
      • newContact が NULL の場合、Failed to create contact を出力してプログラムを終了する
      • 成功した場合、Contact initialized with default values を出力する
    • 矢印演算子を使用し、初期化された連絡先情報を次の正確な形式で表示する:
      • Default Contact Values:
      • Name: [name](空になります)
      • Phone: [phone](空になります)
      • Email: [email](空になります)
      • Age: [age](0 になります)
    • free(newContact) を使用して、動的に割り当てたメモリを解放する
    • Memory freed successfully を出力する

このチャレンジでは、ファクトリー関数という概念を扱います。ファクトリー関数とは、動的に割り当てられた構造体へのポインターを作成して返す関数です。動的メモリ割り当て、適切なエラーチェック、ポインターを介した構造体の初期化、メモリのクリーンアップについて練習します。

自分で試してみよう

#include <stdio.h>
#include <string.h>

// TODO: Define the Contact struct here
struct Contact {
    char name[50];
    char phone[20];
    char email[40];
    int age;
};

int main() {
    // TODO: Create a Contact variable named person
    struct Contact person;
    
    // Read input values
    scanf("%s", person.name);
    scanf("%s", person.phone);
    scanf("%s", person.email);
    scanf("%d", &person.age);
    
    // TODO: Write your validation and output code below
    if (person.age < 0 || person.age > 120) {
        printf("Invalid age");
        return 0;
    }
    
    if (strlen(person.phone) < 10) {
        printf("Invalid phone number");
        return 0;
    }
    
    printf("Contact Information:\n");
    printf("Name: %s\n", person.name);
    printf("Phone: %s\n", person.phone);
    printf("Email: %s\n", person.email);
    printf("Age: %d\n", person.age);
    
    printf("Name length: %lu\n", strlen(person.name));
    
    if (person.age >= 0 && person.age <= 17) {
        printf("Category: Minor");
    } else if (person.age >= 18 && person.age <= 64) {
        printf("Category: Adult");
    } else {
        printf("Category: Senior");
    }
    
    return 0;
}

Logic & Flowのすべてのレッスン

自分で練習してみよう: Cオンラインコンパイラ