J'ai lu les deux post dont tu parles et je ne vois pas ce qui est difficile à comprendre... excepté peut-être ces deux lignes
Bon, la première ligne permet de faire saisir un nombre. Classique. Mais que se passe-t-il si l'utilisateur tape "12qsdqsd" suivi du "<return>" qui valide la saisie ??? La fonction "scanf()" récupère alors tout ce qui correspond au format attendu "%ld" donc le "12" mais laisse dans le périphérique représentant le clavier tout ce qui reste, c'est à dire "qsdqsd<return>". Et là, tu arrives sur un problème => si plus tard dans ton code tu fais saisir un nom (par exemple), ben ton programme, au lieu d'attendre sagement que tu tapes le nom, ira récupérer ce qui reste c.a.d. "qsdqsd".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ret = scanf ("%ld", &temp); scanf ("%*[^\n]"), getchar ();
Donc pour éviter ce problème, il faut purger le clavier d'où le scanf("%*[^\n]") qui signifie "j'attends du clavier toute chaîne sauf "\n" (qui représente le "<return>").
A ce moment là, le scanf() récupère et supprime du clavier tout ce qui correspond au modèle (soit "qsdqsd") et il ne reste que le "<return>" qu'on supprime avec le "getchar()". Simple non ???
Comme tout le monde
ATTENTION ATTENTION aux analogies. Faut pas confondre "valeur renvoyée par une fonction" et "code d'état d'une commande Unix".
En C, toute fonction renvoie une valeur. Cette valeur représente le "résultat" de la fonction. Ce résultat peut donc être n'importe quoi (un calcul, une chaîne, etc).
En shell Unix, un programme (et aussi une fonction car ça marche pareil) ne renvoie qu'un état. Cet état est compris entre 0 et 255. On ne peut donc pas se servir de cet état pour représenter un résultat car on peut pas représenter un résultat plus grand que 255.
Cet état n'est utilisé que pour détecter si le programme (ou si la fonction) s'est bien déroulé ou pas mais ne pourra jamais être utilisé comme résultat.
La méthode pour utiliser une commande Unix comme résultat est d'utiliser les backquottes ( => `commande`) qui permettent de récupérer ce que la commande affiche. Cet affichage peut donc être utilisé comme résultat dans un code plus vaste.
Exemple:
carré d'un nombre en C
carré d'un nombre en shell
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 unsigned long carre(long nb) { return nb * nb; // Ce "return" signifie "renvoi du résultat attendu" } main() { printf("Carré de 5: %lu\n", carre(5)); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 #!/bin/sh carre() { expr $1 \* $1 # => Simple affichage à l'écran (qui pourra être utilisé ailleurs comme résultat) return 0 # => Ce "return" signifie "traitement ok" et non "résultat" } echo "Carré de 5:" `carre 5` # => Récupération de l'affichage ici - Et on ne se sert pas de "$?" car on n'en n'a pas besoin
Partager