#include #include #include #define N 5 #define NumLength (10+4+1) #define IntLength (8) union description { unsigned char lettresPref[2]; float taille; long long int telephone; }; enum descType {LettresPref, Taille, Telephone}; typedef struct personne personne; struct personne{ int age; char* initiales; enum descType descType; union description* desc; }; void description(personne* p){ switch(p->descType){ case LettresPref: printf("%s, agé de %d ans a pour lettres préférées le %c et le %c.\n",p->initiales, p->age, p->desc->lettresPref[0], p->desc->lettresPref[1]); break; case Taille: printf("%s, agé de %d ans mesure %f m \n",p->initiales, p->age, p->desc->taille); break; case Telephone: printf("%s, agé de %d ans est joignable au %llu \n",p->initiales, p->age, p->desc->telephone); break; } } int scanfs(char* dest, int length){ if(fgets(dest, length-1, stdin)==NULL){ return 1;// Une erreur est survenue lors de la lecture (trop long ?) } // On doit supprimer le retour à la ligne qu'a capturé fgets. int i; for(i=0;i=length){// On a Overflow // On nettoie les caracteres ecrits en trop while( (!strchr(dest,'\n')) && (!strchr(dest,EOF))) if(!fgets(dest, length-1,stdin)) break; return 2; } dest[i] = '\0'; return 0; } void nextLine(){ int c; while ((c = getchar()) != '\n' && c != EOF) { }; } void demander(personne* p){ int age; int descTypeN; char* initiales = calloc(IntLength,sizeof(char)); if(initiales==NULL)return; printf("Création d'une nouvelle personne : \n"); do{ printf("Initiales : "); } while(scanfs(initiales,IntLength)); printf("Âge : "); if(scanf("%d", &age)!=1){ printf("Ce n'est pas un nombre, je met 42 dans le doute\n"); nextLine(); age = 42; } else getchar(); printf("Quelle description allez-vous donner (0 pour les lettres, 1 pour la taille, 2 pour le num) ? "); if(scanf("%d", &descTypeN)!=1){ printf("Ce n'est pas un nombre, je met 2$ dans le doute\n"); nextLine(); descTypeN = 2; } else getchar(); enum descType descType; union description* desc; switch(descTypeN){ case 0: desc = malloc(sizeof(unsigned char)*2); if(desc==NULL){ free(initiales);return; } printf("Quelles sont ses deux lettres préférées ? "); desc->lettresPref[0] = getchar(); desc->lettresPref[1] = getchar(); nextLine(); descType = LettresPref; break; case 1: desc = malloc(sizeof(float)); if(desc==NULL){ free(initiales);return; } printf("Quelle est sa taille ? "); scanf("%f",&(desc->taille));getchar(); descType = Taille; break; case 2: desc = malloc(sizeof(long long int)); if(desc==NULL){ free(initiales);return; } printf("Quelle est son num ? "); scanf("%llu",&(desc->telephone));getchar(); descType = Telephone; break; } p->initiales = initiales; p->age = age; p->descType = descType; p->desc = desc; } void freePerso(personne* perso){ free(perso->initiales); free(perso->desc); } int lesmeme(personne* p1, personne* p2){ if(!((p1->age==p2->age) && (strcmp(p1->initiales, p2->initiales)==0) && (p1->descType==p2->descType))) return 0; switch(p1->descType){ case LettresPref: return (p1->desc->lettresPref[0])==(p2->desc->lettresPref[0]) && (p1->desc->lettresPref[1])==(p2->desc->lettresPref[1]); case Taille: return (p1->desc->taille)==(p2->desc->taille); case Telephone: return (p1->desc->telephone)==(p2->desc->telephone); } return 0; } int main(){ personne persos[N]; for(int i=0;i