diff --git a/slides/ligne_de_commande_c.md b/slides/ligne_de_commande_c.md new file mode 100644 index 0000000000000000000000000000000000000000..4b662d4222bb55d1a6e8d0894da9ccf17f9fd8b4 --- /dev/null +++ b/slides/ligne_de_commande_c.md @@ -0,0 +1,94 @@ +--- +title: La ligne de commande +date: 2021-11-23 +--- + +# La ligne de commande (1/4) + +* Ou comment passer des arguments à un programme en C. + +## Point d'entrée d'un programme + +- Le point d'entrée est la fonction `main()`{.C}. +- Elle peut être déclarée de 4 façon différentes: + 1. `void main()`{.C}. + 2. `int main()`{.C}. + 3. `void main(int argc, char **argv)`{.C}. + 4. `int main(int argc, char *argv[])`{.C}. + +- `argc`{.C} est le nombre d'arguments passés à la ligne de commande: **le premier est celui du programme lui-même**. +- `argv`{.C} est un tableau de chaînes de caractères passés sur la ligne de commande. + +# La ligne de commande (2/4) + +## Exemple d'utilisation + +Pour la fonction dans le programme `prog` + +```C +int main(int argc, char **argv) +``` + +Pour l'exécution suivante on a + +```bash +$ ./prog -b 50 file.txt +``` + +```C +argc == 4 +argv[0] == "prog" +argv[1] == "-b" +argv[2] == "50" +argv[3] == "file.txt" +``` + +# La ligne de commande (3/4) + +## Conversion des arguments + +- Les arguments sont toujours stockés comme des **chaînes de + caractères**. +- Peu pratique si on veut manipuler des valeurs numériques. +- Fonctions pour faire des conversions: + + ```C + int atoi(const char *nptr); + long atol(const char *nptr); + long long atoll(const char *nptr); + double atof(const char *nptr); + int snprintf(char *str, size_t size, + const char *format, ...); + // str: buffer, size: taille en octets max à copier, + // format: cf printf(), ret: nombre de char lus + ``` + +# La ligne de commande (4/4) + +## Exemple d'utilisation + +\footnotesize + +```C +#include <stdio.h> +#include <stdlib.h> +#include <libgen.h> +int main(int argc, char **argv) { + if (argc != 3) { + char *progname = basename(argv[0]); + fprintf(stderr, "usage: %s name age\n", progname); + return EXIT_FAILURE; + } + char *name = argv[1]; + int age = atoi(argv[2]); + printf("Hello %s, you are %d years old.\n", name, age); + return EXIT_SUCCESS; +} +``` + +. . . + +```bash +$ ./prog Paul 29 +Hello Paul, you are 29 years old. +```