連絡先を作成する関数
CoddyのCジャーニー「Logic & Flow」セクションの一部。レッスン 51/63。
チャレンジ
簡単前のレッスンで作成した Contact 構造体を基に、新しい連絡先のメモリを動的に割り当てる関数を作成してください。プログラムでは次のことを行います。
- 前のレッスンと同じ
Contact構造体の定義を使用し、次のメンバーを含めます。- サイズ 50 の文字配列
name - サイズ 20 の文字配列
phone - サイズ 40 の文字配列
email - 整数型の
age
- サイズ 50 の文字配列
createContactという名前の関数を作成し、次の処理を行います。- パラメーターを受け取らない
Contact構造体へのポインターを返すmalloc()を使用して、1 つのContact構造体用のメモリを動的に割り当てる- メモリの割り当てが成功したか確認する:
- 割り当てに失敗した場合(NULL を返す場合)、
Memory allocation failedを出力して NULL を返す - 割り当てに成功した場合、
Contact created successfullyを出力する
- 割り当てに失敗した場合(NULL を返す場合)、
- 矢印演算子を使用して、すべての構造体メンバーを Default 値で初期化する:
nameをcontactPtr->name[0] = '\0';を使用して空の文字列に設定するphoneをcontactPtr->phone[0] = '\0';を使用して空の文字列に設定するemailをcontactPtr->email[0] = '\0';を使用して空の文字列に設定するageをcontactPtr->age = 0;を使用して 0 に設定する
- 新しく作成した連絡先へのポインターを返す
- 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オンラインコンパイラ