TP1&2: Utiliser les arguments passés en ligne de commande

Comme nous l’avons vu en cours, un programme C commence à s’exécuter à partir d’une fonction main. La signature de cette fonction est:

int main (int argc, char* argv[]);

Rappel de cours: au lancement du programme, le paramètre argc est initialisé avec le nombre d’arguments passés sur la ligne de commande (séparés par un espace); le paramètre argv est initialisé avec ces chaines de caractères. Prenons l’exemple de gcc, écrit en C: lorsque vous lancez gcc avec la ligne de commande suivante:

$gcc my_prog.c -o my_prog

alors la fonction main de gcc (aussi appelée point d’entrée du programme), est appelé avec les valeurs suivantes pour argc et argv:

  • argc vaut 4
  • argv vaut {« gcc », »my_prog.c », »-o », »my_prog »}

Nous allons écrire un programme appelé sum et qui prend en paramètre, sur la ligne de commande, deux entiers. Dans cet exercice, l’objectif est simplement de vérifier que l’utilisateur de notre programme, lorsqu’il le lance, a donné le bon nombre de paramètres et que ces paramètres sont des entiers.

Nous mettons à votre disposition, dans l’archive des codes de TP, un début de solution. Le fichier correspondant est dans TP_INF104/TP1and2/part1_args/material/sum.c. Ce code contient simplement l’implémentation vide de la fonction main, à compléter et une fonction que vous pourrez utiliser:

void display_message(char* msg);

Comme son nom l’indique, cette fonction affiche simplement à l’écran le message qui lui est passé en paramètre.

Vous pouvez appeler cette fonction comme suit:

display_message("message to display\n");

Lorsque la fonction display_message sera invoqué, le message s’affichera dans l’environnement d’exécution de commandes: message to display dans notre cas. Le caractère ‘\n’ est un simple retour à la ligne.

Exercice 1: compléter le code de la fonction main de sorte à afficher le message suivant:

Wrong usage, 2 parameters expected: ./sum param1 param2

lorsque l’utilisateur n’a pas passé le bon nombre de paramètres. Testez votre implémentation en compilant et en executant le programme avec différentes configurations:

  1. Compilation: dans le terminal, déplacez vous dans le répertoire TP_INF104/TP1and2/part1_args/material/ (en utilisant la commande cd) et exécuter gcc:
    $gcc sum.c -o sum
  2. Exécution: lancez les commandes suivantes
    $./sum 2 3
    $./sum 2
    $./sum 2 3 4

Observez le résultat, et vérifiez que le comportement est celui que vous attendiez.

Exercice 2: écrire le code de la fonction:

char isCharInteger(char c);

L’implémentation vide est donnée dans le fichier sum.c. Cette fonction renvoie 1 si le paramètre c est un entier, et 0 sinon. Nous vous demandons d’utiliser la construction switch/case pour implémenter cette fonction.

Rappel de cours: un caractère constant, en c, s’écrit entre simple guillemet ‘: par exemple le caractère a est ‘a’ ou encore le caractère null ‘\0’ (fin de chaine de caractères).

Exercice 3: compléter le code de la fonction main de sorte à afficher le message suivant:

Wrong usage, parameters param1 and param2 should be integers when executing ./sum param1 param2

lorsque l’utilisateur n’a pas passé des paramètres sous la forme d’entiers. Pour vérifier que les deux paramètres passés par l’utilisateur sont bien des entiers, il faudra vérifier que chaque caractère de chaque chaine est un entier en utilisant la fonction isCharInteger.

Testez votre implémentation en compilant et en executant le programme avec différentes configurations:

  1. Compilation: dans le terminal, déplacez vous dans le répertoireTP_INF104/TP1and2/part1_args/material/ (en utilisant la commande cd) et exécuter gcc:
    $gcc sum.c -o sum
  2. Exécution: lancez les commandes suivantes
    $./sum 22 34
    $./sum 2 33
    $./sum 2a 3c

Suite des TP 1 et 2