correction 4: Passer des arguments

Publié le par JJ

Bon. Ce n'était pas très dur. Il avait deux erreurs de sémantique et un problème de robustesse à régler.


SEMANTIQUE

L'erreur de semantique numéro 1 est de confondre argc (dans la correction arg_compteur) avec un indice sur le dernier élément du tableau. Si les chaines de caractères sont argv[0] , argv[1] argv[2] (arg_valeur dans la correction) le compteur (argc, arg_compteur) vaudra 3 car il y a 3 cases dans le tableau . !!!

L'erreur de sémantique numéro 2 est de déclarer argc et argv comme des variables modifiables.  Comme  il s'agit d'une saisie  de l'utilisateur, on ne devrai pas pouvoir la modifier. Donc on met des "const".


ROBUSTESSE

Que se passe t'il si on on appelle
./somme 3 Abcd ?
Une des  conversion va échouer. L'utilisateur n' pas a vouloir sommer un "mot" avec un "entier" avec des guillemets car  il s'agit de  chaine de  caractères (exactement  un  tableau  de caractères dont le dernier  caractère  est  maintenu  à  0  par convention. On ne doit pas parler de String. Ce n'est pas du C++!)


CORRIGE

J'ai mis en gras les changements par rapport à la version de l'exercice. J'ai renommé argc et argv en arg_compteur et arg_valeur pour des question de relecture, les noms sont  transparents en C.

#include <stdio.h>

int main(const int arg_compteur, const char* arg_valeur[])
{
    int a,b;
    int ra, rb;
   
    /* arg_compteur compte le nombre de chaines de caractere de la ligne de commandes. executable + 2 arguments = 3 chaines  */
   
    if (arg_compteur < 3)
        /* argc[0] contient toujours le nom de l'executé */
        printf("Utilisation: %s [entier] [entier]\n", arg_valeur[0]);
    else{
        /* pour la compréhension */
         printf("votre saisie: \n");
       printf("argument [0]: \"%s\",\n",arg_valeur[0]);
       printf("argument [1]: \"%s\",\n",arg_valeur[1]);
       printf("argument [2]: \"%s\".\n",arg_valeur[2]);
       
       
        /* conversion de la chaine argument en entier*/
        ra = sscanf(arg_valeur[1],"%d", &a);

        /* conversion de la chaine argument en entier*/
        rb = sscanf(arg_valeur[2],"%d", &b);       

        /* test si les conversions ont réussies */
        if ((rb == 1) && (ra == 1)){
            /* somme */
            printf("\nsomme: %d + %d = %d\n\n",a,b,a+b);
        }
        else{
            printf("Verifiez d'avoir proposer 2 entiers à sommer\n");
        }
    }
    return 0;
}

Parfois Over blog supprime les anti-slach \\
, c'est génant pour les séquences d'échapement \n et \". Veuillez les vérifier avant de compiler.

RESUME

* les arguments sont passés à votre programme sous forme de chaine de caractères.
* chaque chaine de caractères est stoquée dans un tableau.
* le nombre d'entrée du tableau est stocké dans la variable argc.
* les variables arguments portent généralement les nom argc pour le compteur et argv pour le tableau.
* les variables arguments ne devraient pas être modifiée lors de l'execution du programme.

Vos commentaires sont les bien venus ...

Publié dans Corrections

Commenter cet article