Menu
Coddy logo textTech

連絡先を表示する関数

CoddyのCジャーニー「論理と制御フロー」セクションの一部。レッスン 53/63。

challenge icon

チャレンジ

簡単

前のレッスンで作成した連絡先管理システムを基に、連絡先情報を整形して表示する関数を作成してください。このレッスンでは、必要となる3つの新しい文字列関数 fgets()strcspn()strchr() を紹介します。それぞれの関数については、要件の前に説明します。

このレッスンで使用する新しい関数:

  • fgets(buffer, size, stdin):スペースを含む入力行を読み取ります(空白文字で停止する scanf とは異なります)。入力を buffer に格納し、最大で size - 1 文字を読み取ります。また、末尾に改行文字 '\n' も格納します。
  • strcspn(str, "\n")str 内で最初に '\n' が現れる位置のインデックスを返します。fgets によって残された末尾の改行を削除するために使用します:str[strcspn(str, "\n")] = '\0';
  • strchr(str, ch)str 内で文字 ch を検索し、その位置へのポインターを返します。見つからない場合は NULL を返します。

プログラムでは、次のことを行ってください:

  1. 前のレッスンと同じ Contact 構造体の定義を使用し、次のメンバーを含めます:
    • サイズ50の文字配列 name
    • サイズ20の文字配列 phone
    • サイズ40の文字配列 email
    • 整数 age
  2. 前のレッスンと同じ createContact 関数を使用し、この関数で次の処理を行います:
    • Contact 構造体用のメモリを動的に割り当てる
    • すべてのメンバーをデフォルト値で初期化する
    • 連絡先へのポインターを返す
  3. populateContact 関数を作成し、次の処理を行います:
    • Contact 構造体へのポインターをパラメーターとして受け取る
    • 各文字列フィールド(name、phone、email)の読み取りに fgets() を使用し、スペースを含む名前も受け付けられるようにする
    • 各文字列フィールドの読み取り後に strcspn() を使用して末尾の改行を削除する
    • scanf("%d", ...) を使用して整数の age フィールドを読み取る
    • 注:このバージョンの populateContact には電話番号の長さの検証を含めません。テスト入力では 555-1234 のような短い電話番号を使用するため、追加しないでください
  4. displayContact という名前の関数を作成し、次の処理を行います:
    • Contact 構造体への定数ポインターをパラメーターとして受け取る:const struct Contact *contactPtr
    • 何も返さない(void)
    • 連絡先情報を次の正確な形式で出力する:
      • === CONTACT DETAILS ===
      • Name: [name]
      • Phone: [phone]
      • Email: [email]
      • Age: [age] years old
      • ========================
    • 基本情報を表示した後、追加の詳細を計算して表示する:
      • strlen() を使用して name の長さを計算し、Name length: [length] characters と出力する
      • age に基づいて Generation のカテゴリを判定し、次のように出力する:
        • age が0から12までの場合:Generation: Child
        • age が13から19までの場合:Generation: Teenager
        • age が20から39までの場合:Generation: Young Adult
        • age が40から59までの場合:Generation: Middle-aged Adult
        • age が60以上の場合:Generation: Senior
      • strchr() を使用して email に文字 '@' が含まれているかを確認し、次のように出力する:
        • '@' が見つかった場合:Email format: Valid
        • '@' が見つからない場合:Email format: Invalid
  5. main 関数では、次の処理を行います:
    • createContact 関数を使用して連絡先を作成する
    • 連絡先の作成に成功したか確認する
    • populateContact 関数を呼び出して連絡先データを入力する
    • displayContact 関数を呼び出して整形した連絡先情報を表示する
    • 動的に割り当てたメモリを解放する
    • Program completed successfully を出力する

このチャレンジでは、構造体への定数ポインターを受け取る表示関数の作成方法を学びます。これにより、その関数が元のデータを変更できないようにします。スペースを含む文字列を読み取るための fgets()、末尾の改行を削除するための strcspn()、ポインターを通じて構造体メンバーにアクセスする矢印演算子、文字を検索するための strchr()、そしてデータを分類するための条件分岐を練習します。パラメーター宣言で const を使用することは、display 関数内で連絡先データを誤って変更するのを防ぐ優れた実践方法です。

自分で試してみよう

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

typedef struct {
    char name[50];
    char phone[20];
    char email[40];
    int age;
} Contact;

Contact* createContact() {
    Contact* contact = (Contact*)malloc(sizeof(Contact));
    if (contact == NULL) {
        return NULL;
    }
    
    strcpy(contact->name, "");
    strcpy(contact->phone, "");
    strcpy(contact->email, "");
    contact->age = 0;
    
    return contact;
}

void populateContact(Contact* contactPtr) {
    printf("Enter name: ");
    scanf("%s", contactPtr->name);
    
    printf("Enter phone: ");
    scanf("%s", contactPtr->phone);
    
    printf("Enter email: ");
    scanf("%s", contactPtr->email);
    
    printf("Enter age: ");
    scanf("%d", &contactPtr->age);
    
    if (contactPtr->age < 0 || contactPtr->age > 120) {
        printf("Invalid age entered\n");
    } else if (strlen(contactPtr->phone) < 10) {
        printf("Invalid phone number\n");
    } else {
        printf("Contact populated successfully\n");
    }
}

int main() {
    Contact* contact = createContact();
    
    if (contact == NULL) {
        return 1;
    }
    
    populateContact(contact);
    
    printf("Contact Information:\n");
    printf("Name: %s\n", contact->name);
    printf("Phone: %s\n", contact->phone);
    printf("Email: %s\n", contact->email);
    printf("Age: %d\n", contact->age);
    
    free(contact);
    printf("Contact deleted successfully\n");
    
    return 0;
}

論理と制御フローのすべてのレッスン

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