Solution de l’exercice 6.8

Il suffit d’utiliser une chaîne de caractères normale, plus un pointeur indiquant l’emplacement du début du prénom ; selon les besoins, on placera un zéro ou un blanc entre les deux. De même, un autre pointeur indiquera la séparation entre les deux prénoms orientaux. Ce second séparateur est à zéro pour un occidental :

class noms {     char chaine[32];     char *separateur;         // adresse du zéro ou blanc     char *separateur2;        // adresse du zéro ou tiret     public :     noms(char *nom, char *prenom1, char *prenom2 = 0)         {          int i = (prenom2 ? 10 : 15);          strncpy(chaine, nom, i);          separateur = strchr(chaine, 0);          separateur2 = separateur+1;          strncpy(separateur2, prenom1, i);          if (prenom2) {             separateur2 = strchr(separateur2, 0);             strncpy(separateur2+1, prenom2, i);              }          else separateur2 = 0;         }     char *nom(void)         { *separateur = 0; return chaine; }     char *prenom1(void)         { if (separateur2) *separateur2 = 0;           return separateur+1; }     char *prenom2(void)         { if (separateur2) return separateur2+1;           else return ""; }     char *prenomcomplet(void)         { if (separateur2) *separateur2 = '-';           return 1+separateur; }     char *nomcomplet(void)          { *separateur = ' ';            prenomcomplet();            return chaine; }     };

Cette classe n’occupe que cinq octets de plus que l’autre, et la facilité des opérations est un gain de temps important. On notera d’ailleurs que l’on n’est plus obligé de tronquer les chaînes : si un nom fait 20 caractères et le prénom 8, on peut les placer ensemble ; une meilleure implantation du constructeur est donc possible (nouvel exercice...).


Retour au texte.