Cest un peu plus difficile, mais voici une solution, avec un petit programme dessai :
#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 %
, sils 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 nest pas modifiée), et de form
(sinon le compilateur refuse dy copier format
).