Menu
Coddy logo textTech

Fonction pour afficher un contact

Fait partie de la section Logique & Flux du Journey C de Coddy. Leçon 53 sur 63.

challenge icon

Défi

Facile

En vous appuyant sur votre système de gestion des contacts des leçons précédentes, créez une fonction qui affiche les informations d’un contact dans un format structuré. Cette leçon présente trois nouvelles fonctions de manipulation des chaînes 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 de saisie, espaces compris (contrairement à scanf, qui s’arrête aux espaces). Elle stocke la saisie 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. Cette fonction sert à supprimer la nouvelle ligne finale laissée 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 la structure Contact que dans les leçons précédentes, avec les membres suivants :
    • 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 que dans les 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 comme paramètre un pointeur vers une structure Contact
    • Utilise fgets() pour lire chaque champ de type chaîne (nom, téléphone, e-mail), afin d’accepter les noms contenant des espaces
    • Utilise strcspn() pour supprimer la nouvelle ligne finale de chaque champ de type chaîne après sa lecture
    • Utilise scanf("%d", ...) pour lire le champ entier correspondant à l’âge
    • Remarque : cette version de populateContact n’inclut pas de validation de la longueur du numéro de téléphone : n’en ajoutez pas, car les entrées de test utilisent des numéros courts tels que 555-1234
  4. Écrire une fonction nommée displayContact qui :
    • Prend comme paramètre un pointeur constant vers une structure Contact : const struct Contact *contactPtr
    • Ne renvoie rien (void)
    • Affiche les informations du contact dans ce format exact :
      • === 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 générationnelle 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 supérieur ou égal à 60 : 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 :
    • Créer un contact à l’aide de la fonction createContact
    • Vérifier que 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 formatées du contact
    • Libérer la mémoire allouée dynamiquement
    • Afficher Program completed successfully

Ce défi montre comment créer une fonction d’affichage qui prend un pointeur constant vers une structure, afin de garantir que la fonction ne puisse 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 nouvelles lignes finales, l’opérateur flèche pour accéder aux membres d’une structure par l’intermédiaire d’un pointeur, strchr() pour rechercher des caractères et la logique conditionnelle pour catégoriser les données. L’utilisation de const dans la déclaration du paramètre est une bonne pratique qui empêche toute modification accidentelle des données du 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 Logique & Flux

Entraînez-vous par vous-même : Compilateur C en ligne