correction 4: Passer des arguments
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
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.
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
Vos commentaires sont les bien venus ...
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;
}
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.
* 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.