Fonction pour afficher un contact
Fait partie de la section Logique & Flux du Journey C de Coddy. Leçon 53 sur 63.
Défi
FacileEn 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 dansbuffer, en lisant au maximumsize - 1caractè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'dansstr. Cette fonction sert à supprimer la nouvelle ligne finale laissée parfgets:str[strcspn(str, "\n")] = '\0';strchr(str, ch): recherche le caractèrechdansstret renvoie un pointeur vers son emplacement, ouNULLs’il n’est pas trouvé.
Votre programme doit :
- Utiliser la même définition de la structure
Contactque dans les leçons précédentes, avec les membres suivants :- Un tableau de caractères
namede taille 50 - Un tableau de caractères
phonede taille 20 - Un tableau de caractères
emailde taille 40 - Un entier
age
- Un tableau de caractères
- Utiliser la même fonction
createContactque 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
- Alloue dynamiquement de la mémoire pour une structure
- Écrire une fonction
populateContactqui :- 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
populateContactn’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 que555-1234
- Prend comme paramètre un pointeur vers une structure
- Écrire une fonction nommée
displayContactqui :- 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
- Si l’âge est compris entre 0 et 12 :
- Vérifie si l’e-mail contient le caractère
'@'à l’aide destrchr()et affiche :- Si
'@'est trouvé :Email format: Valid - Si
'@'n’est pas trouvé :Email format: Invalid
- Si
- Calcule la longueur du nom à l’aide de
- Prend comme paramètre un pointeur constant vers une structure
- 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
populateContactpour remplir les données du contact - Appeler la fonction
displayContactpour afficher les informations formatées du contact - Libérer la mémoire allouée dynamiquement
- Afficher
Program completed successfully
- Créer un contact à l’aide de la fonction
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
1Les bases des pointeurs
Qu'est-ce qu'un pointeur ?Déclaration de pointeursL'opérateur d'adresse (&)L'opérateur de déréférencement (*)Pointeurs NULLRécapitulatif : Les bases des pointeurs4Projet : Utilitaire de texte simple
Présentation du projetCompter les caractères2Pointeurs et Tableaux
Noms de tableaux comme pointeursÉléments de tableau - PointeursArithmétique des pointeursComparaison de pointeursRécapitulatif : Parcours de tableau par pointeur5Pointeurs et fonctions
Passage par valeurPassage de pointeurs aux fonctionsModifier des variables via des pointeursUn exemple classique : SwapPassage de tableaux aux fonctionsRécapitulatif : Pointeurs comme arguments de fonction3Tableaux de caractères et chaînes
Les chaînes comme tableaux de charLe terminateur nulSaisie de chaînes avec scanfUtilisation de strlen()Utilisation de strcpy()Utilisation de strcat()Utilisation de strcmp()Récapitulatif : Fonctions de base sur les chaînes6Gestion de la mémoire
Mémoire Pile vs TasAllocation dynamique - malloc()Utiliser sizeof() pour l'allocationVérifier l'échec de l'allocationLibérer la mémoire avec free()Allouer avec calloc()Récapitulatif : Tableaux dynamiques9Projet : Saisie de contact simple
Projet : Définir la structure ContactFonction pour créer un contactEntraînez-vous par vous-même : Compilateur C en ligne