Menu
CoddyTech

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 le système de gestion des contacts des leçons précédentes, créez une fonction qui affiche les informations d’un contact de manière formatée. Cette leçon présente 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 consignes.

Nouvelles fonctions utilisées dans cette leçon :

  • fgets(buffer, size, stdin) : lit une ligne d’entrée, espaces compris (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. Elle est utilisée pour supprimer le caractère de nouvelle 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 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 un pointeur vers une structure Contact comme paramètre
    • Utilise fgets() pour lire chaque champ de chaîne (name, phone, email), afin d’accepter les noms contenant des espaces
    • Utilise strcspn() pour supprimer le caractère de nouvelle ligne final de chaque champ de chaîne après sa lecture
    • Utilise scanf("%d", ...) pour lire le champ entier de l’âge
    • Affiche l’invite correspondante avant de lire chaque champ, exactement comme indiqué et sans retour à la ligne à la fin : Enter name: , Enter phone: , Enter email: , Enter age: (ainsi, === CONTACT DETAILS === suit Enter age: sur la même ligne)
    • 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 comme 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 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 égal ou supérieur à 60 : Generation: Senior
      • Vérifie si l’adresse 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 main :
    • 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 renseigner 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 peut pas modifier les données d’origine. Vous vous exercerez à utiliser fgets() pour lire des chaînes contenant des espaces, strcspn() pour supprimer les caractères de nouvelle ligne finaux, l’opérateur flèche pour accéder aux membres d’une structure via un pointeur, strchr() pour rechercher un caractère 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 évite toute modification accidentelle des données du contact dans 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