Exercice : Principe du type de donnée union
Nous avons un programme à écrire répondant au problème suivant :
Nous devons lire une suite de lignes pouvant varier en forme. Les lignes comprennent un nombre de champs quelconques (<256). Les champs peuvent être de longueur fixe (<256) ou de longueur variable. Dans le premier cas, la longueur du champ est fixée par ligne. Dans le second cas, un caractère sert de séparateur de champ. Ce caractère ou la longueur varient d'une ligne à l'autre.
Cette suite est précédée d'une suite de descriptions de chaque ligne. Ces dernières indiquent par ligne le nombre de champs, l'information fixe ou variable de la longueur du champ et la taille ou le caractère de séparation.
Nous avons défini une structure pour stocker les informations de description utilisées pour la lecture d'une ligne. Voici un extrait de listing avec la déclaration et une séquence de lecture d'une description de ligne. Analysez-le pour comprendre les différentes instructions.
struct forme{
bool fixe ;
int longueur ;
char separateur ;
int nombre ;
} slecture ;
...
char fcfixe, ;
/* lecture ligne description */
scanf("%d", &slecture.nombre) ;
scanf("%c", &cfixe) ;
slecture.fixe=cfixe=='f' ;
if (slecture.fixe) scanf("%d", &slecture.longueur) ;
else scanf("%c", &slecture.separateur) ;
scanf ("%*[^\n]"); /* élimine le reste de la ligne*/
getchar (); /* élimine le retour ligne */
struct forme{ bool fixe ; int longueur ; char separateur ; int nombre ; } slecture ; ... char fcfixe, ; /* lecture ligne description */ scanf("%d", &slecture.nombre) ; scanf("%c", &cfixe) ; slecture.fixe=cfixe=='f' ; if (slecture.fixe) scanf("%d", &slecture.longueur) ; else scanf("%c", &slecture.separateur) ; scanf ("%*[^\n]"); /* élimine le reste de la ligne*/ getchar (); /* élimine le retour ligne */
Il ressort des spécifications du problème que, pour une ligne, nous utilisons de façon exclusive soit un caractère, soit un entier. Ainsi, des deux champs de la structure longueur et séparateur contiendront une donnée utilisable pour la lecture.
Pour réduire la taille nécessaire pour toutes les descriptions, nous allons utiliser la structure adaptée à cette présence exclusive longueur / séparateur : la structure de donnée union
.
Parmi les affirmations suivantes, validez celles qui sont correctes :