Solution de l’exercice 5.2

C’est un peu plus difficile, mais voici une solution, avec un petit programme d’essai :

#include <iostream.h>#include <stdarg.h>				inline void ecritchar(char c) { cout << c; }				inline void ecritint(int i) { cout << i; }				inline void ecritdouble(double d) { cout << d; }				void printf2(const char *format ...){     va_list vl;     va_start(vl, format);     for (const char *form = format; *form; form++)         if (*form != '%') ecritchar(*form);         else         switch (*++form) {           case 'd' : ecritint(va_arg(vl, int)); break;           case 'g' : ecritdouble(va_arg(vl, double));                      break;           case 'c' : ecritchar(va_arg(vl, char)); break;           case 's' : for (char *s = va_arg(vl, char*) ; *s; s++)                           ecritchar(*s);                      break;           default : ecritchar(*form);    // ignorer le %         }     va_end(vl);}				main(){     printf2("Nombre = %d%%.\n", 12);     printf2("%s + %s\n", "chaine1", "chaine2");     printf2("Racine de %d = %g\n", 2, 1.4142);     printf2("Tabulation = %c et CR = %c", '\t', '\n');     return 0;}

Les trois fonctions ecritxxx ont été déclarées inline à cause de leur petitesse. On notera que le doublon %% est bien traité (premier exemple), grâce à la clause default : les caractères qui suivent un %, s’ils ne sont pas dans la liste des codes, sont affichés normalement et le % est ignoré. Noter aussi la déclaration en const char* de format (car la chaîne n’est pas modifiée), et de form (sinon le compilateur refuse d’y copier format).


Retour au texte.