Listes d'arguments variables
Solutions des exercices


  1. Concevoir une fonction "moyenne" qui calcule la moyenne d'un nombre n donné mais variable de réels.

    #include <stdio.h>
    #include <stdarg.h>
    
    /* La fonction moyenne
       Arguments :
         n   : le nombre de reels dans la liste d'arguments variable
         ... : une liste d'arguments de type double variable
       Resultat :
         la moyenne des reels de la liste d'arguments variable
    */
    double moyenne (int n, ...) {
      va_list listeReels;
      int cptrArgs;
      double somme;
    
      va_start (listeReels, n);
      for (somme = cptrArgs = 0; cptrArgs < n; cptrArgs++)
        somme += va_arg (listeReels, double);
      va_end (listeReels);
      return (n != 0) ? (somme / n) : 0;
    }
    
    /* Le programme de test */
    int main() {
      printf("moyenne(2, 4.0, 6.0) = %f\n",
              moyenne(2, 4.0, 6.0));
      printf("moyenne(4, 4.5, 6.0, 7.25, 8.75) = %f\n",
              moyenne(4, 4.5, 6.0, 7.25, 8.75));
      printf("moyenne(0) = %f\n",
              moyenne(0));
    }
  2. Concevoir une fonction "concaténation" qui concatène un nombre n donné mais variable de chaînes de caractères et les stocke dans une chaîne destination.

    Comme il faut d'abord connaître la taille de la chaîne destination, il faut traiter deux fois la liste d'arguments variable, une fois pour calculer la taille de la destination et une deuxième fois pour y stocker les chaînes.

    #include <stdio.h>
    #include <string.h>
    #include <stdarg.h>
    
    /* La fonction concat
       Arguments :
         n   : le nombre de chaines dans la liste d'arguments variable
         ... : une liste d'arguments de type char * variable
       Resultat :
         la concatenation des chaines
    */
    char *concat (int n, ...) {
      va_list listeChaines;
      int cptrArgs;
      size_t taille;
      char *resultat;
    
      va_start(listeChaines, n);
      for (taille = cptrArgs = 0; cptrArgs < n; cptrArgs++)
        taille += strlen(va_arg(listeChaines, char *));
      va_end(listeChaines);
    
      resultat = (char *) malloc(taille + 1);
      if (NULL != resultat) {
        va_start(listeChaines, n);
        strcpy(resultat, "");
        for (cptrArgs = 0; cptrArgs < n; cptrArgs++)
          strcat(resultat, va_arg(listeChaines, char *));
        va_end(listeChaines);
      }
    
      return resultat;
    }
    
    /* Le programme de test */
    int main() {
      printf("concat(4, \"Ceci\", \" est\", \" un\", \" test.\") = \"%s\"\n",
              concat(4, "Ceci", " est", " un", " test."));
      printf("concat(2, \"Ceci\", \" aussi\") = \"%s\"\n",
              concat(2, "Ceci", " aussi"));
      printf("concat(0) = \"%s\"\n",
              concat(0));
    }

Valid HTML 4.01! © 2003, Pierre Mousel
Veuillez faire parvenir toute remarque ou commentaire à Pierre Mousel