Menu
Coddy logo textTech

Fonction pour afficher un contact

Fait partie de la section Logic & Flow du Journey C de Coddy — leçon 53 sur 63.

challenge icon

Défi

Facile

En vous appuyant sur votre système de gestion de contacts des leçons précédentes, créez une fonction qui affiche les informations de contact de manière formatée. Cette leçon introduit trois nouvelles fonctions de chaîne de caractères dont vous aurez besoin : fgets(), strcspn(), et strchr() — chacune est expliquée ci-dessous avant les exigences.

Nouvelles fonctions utilisées dans cette leçon :

  • fgets(buffer, size, stdin) — lit une ligne d'entrée incluant les espaces (contrairement à scanf, qui s'arrête aux espaces blancs). Elle stocke l'entrée dans buffer, en lisant au maximum size - 1 caractères. Elle stocke également le caractère de nouvelle ligne '\n' à la fin.
  • strcspn(str, "\n") — renvoie l'index de la première occurrence de '\n' dans str. Utilisé pour supprimer le saut de ligne final laissé par fgets : str[strcspn(str, "\n")] = '\0';
  • strchr(str, ch) — recherche le caractère ch dans str et renvoie un pointeur vers son emplacement, ou NULL s'il n'est pas trouvé.

Votre programme doit :

  1. Utiliser la même définition de structure Contact des leçons précédentes avec les membres :
    • Un tableau de caractères name de taille 50
    • Un tableau de caractères phone de taille 20
    • Un tableau de caractères email de taille 40
    • Un entier age
  2. Utiliser la même fonction createContact des leçons précédentes qui :
    • Alloue dynamiquement de la mémoire pour une structure Contact
    • Initialise tous les membres avec des valeurs par défaut
    • Renvoie un pointeur vers le contact
  3. Écrire une fonction populateContact qui :
    • Prend un pointeur vers une structure Contact comme paramètre
    • Utilise fgets() pour lire chaque champ de chaîne (nom, téléphone, email) afin que les noms avec des espaces soient acceptés
    • Utilise strcspn() pour supprimer le saut de ligne final de chaque champ de chaîne après la lecture
    • Utilise scanf("%d", ...) pour lire le champ entier age
    • Note : Cette version de populateContact n'inclut pas la validation de la longueur du numéro de téléphone — ne l'ajoutez pas, car les entrées de test utilisent des numéros de téléphone courts comme 555-1234
  4. Écrire une fonction nommée displayContact qui :
    • Prend un pointeur constant vers une structure Contact comme paramètre : const struct Contact *contactPtr
    • Ne renvoie rien (void)
    • Affiche les informations de contact exactement dans ce format :
      • === CONTACT DETAILS ===
      • Name: [name]
      • Phone: [phone]
      • Email: [email]
      • Age: [age] years old
      • ========================
    • Après avoir affiché les informations de base, calcule et affiche des détails supplémentaires :
      • Calcule la longueur du nom à l'aide de strlen() et affiche : Name length: [length] characters
      • Détermine la catégorie de génération en fonction de l'âge et affiche :
        • Si l'âge est compris entre 0 et 12 : Generation: Child
        • Si l'âge est compris entre 13 et 19 : Generation: Teenager
        • Si l'âge est compris entre 20 et 39 : Generation: Young Adult
        • Si l'âge est compris entre 40 et 59 : Generation: Middle-aged Adult
        • Si l'âge est de 60 ou plus : Generation: Senior
      • Vérifie si l'e-mail contient le caractère '@' à l'aide de strchr() et affiche :
        • Si '@' est trouvé : Email format: Valid
        • Si '@' n'est pas trouvé : Email format: Invalid
  5. Dans la fonction principale (main) :
    • Créer un contact à l'aide de la fonction createContact
    • Vérifier si la création du contact a réussi
    • Appeler la fonction populateContact pour remplir les données du contact
    • Appeler la fonction displayContact pour afficher les informations de contact formatées
    • Libérer la mémoire allouée dynamiquement
    • Afficher Program completed successfully

Ce défi démontre comment créer une fonction d'affichage qui prend un pointeur constant vers une structure, garantissant que la fonction ne peut pas modifier les données d'origine. Vous vous entraînerez à utiliser fgets() pour lire des chaînes contenant des espaces, strcspn() pour supprimer les sauts de ligne finaux, l'opérateur flèche pour accéder aux membres de la structure via un pointeur, strchr() pour la recherche de caractères, et la logique conditionnelle pour la catégorisation des données. L'utilisation de const dans la déclaration du paramètre est une bonne pratique qui empêche la modification accidentelle des données de contact au sein de la fonction d'affichage.

Essayez vous-même

#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;
}

Toutes les leçons de Logic & Flow