Pas de dépendances
#include <stdio.h> void test1() { int i; scanf("%d",&i); printf("%d\n",i); } void test2() { char chaine[5]; scanf("%s",chaine); printf("%s\n",chaine); } void test3() { char chaine[5]; scanf("%4s",chaine); printf("%s\n",chaine); } void test4() { char chaine[51]; scanf("%50s",chaine); //scanf("%50[^\n]%*c",chaine); printf("%s\n",chaine); } void test5() { char chaine[51]; scanf("%50[^!]%*c",chaine); printf("%s\n",chaine); } void test6() { char chaine[51]; chaine[0]='\0'; scanf("%50[0-9]",chaine); //scanf("%50[0-9a-z]",chaine); //scanf("%50[plouf;)]",chaine); //scanf("%50[0-9-]",chaine); printf("%s\n",chaine); } int main() { test1(); //test2(); //test3(); //test4(); //test5(); //test6(); return 0; }
Quelques exemples pour scanf, découpés en différents tests. Activez les au fur et a mesure en les décommentant dans le main. test1: Test sans vérifications. Si vous entrez un nombre, ça baigne. Si vous entrez une lettre, une phrase, vous obtenez n'importe quoi. test2: Ici, on entre une chaine. Mais la chaine réservée fait 5 octets (caractère final \0 compris) Donc vous avez le droit à 4 caractères. Si vous dépassez, c'est le débordement, et grande chance que ça plante. Si ça ne plante pas, le programme devient de toute façon instable. test3: Même chose que test2, mais sécurisé. En effet, le 4 que j'ai rajouté dans le scanf veut dire que je veux 4 caractère maximum dans ma chaine Les autres sont ignorés. Avec ça, même si vous tapez une grande chaine, vous ne plantez pas. Par contre, le printf derrière vous affiche bien que la partie non ignorée :) test4: Reprenons le scanf. Cette fois, j'ai toléré 50 caractères (le 51e est le \0 terminal) Tapez une phrase. Horreur, elle est coupée au premier espace dans le printf. En fait, c'est le scanf qui s'est arrêté à l'espace. Pour contrer cela, commentez le scanf, et remplacez le par celui commenté d'en dessous. Ici, je dis [^\n], autrement, dit je dis : une liste d'éléments pour le scanf : le [] qui remplacent le s Le ^ veut dire "tout sauf" et ensuite, j'ai mis le retour chariot. Concrêtement, cela veut dire que seul le retour chariot coupe a saisie. Par défaut, on aurait plutot : [^ \n] qui voudrait dire : l'espace et le \n coupent ma chaine. le %*c rajouté permet de lire les caractères de fin, pour avancer jusqu'au prochain caractère à lire. Il flush le tout. test5: scanf sur plusieurs lignes. Si vous appuyez sur entree, vous pouvez continuer à taper. Seul le ! coupera la chaine (par contre, scanf test la coupe qu'après avoir appuyé sur entree) Le printf vous affichera bien plusieurs lignes, puisque votre chaine pourra contenir des \n test6: Plusieurs exemples en un ici. On a enlevé le ^, on ne parle donc plus des caractères qui permettent de sortir de scanf, mais de ceux qu'on veut [0-9] veut dire que tous les nombres de 0 à 9 sont tolérés. Si vous commencez à taper une lettre, la chaine de sortie sera vide. Par contre, si vous commencez par taper des chiffres, puis des lettres, dès la première lettre (donc premier caractère qu'on ne veut pas) la chaine sera coupée. Le deuxième exemple [0-9a-z] accepte les chiffres, et les lettres minuscules seulement Le troisième n'acceptera que les lettres p l o u f, les ; et les parenthèses fermantes. Le quatrième acceptera les caractères de 0 à 9, ainsi que le caractère "-" qui doit être placé à la fin pour désambiguiter l'autre fonction qu'il a dans 0-9