Salut,
Avec scanf,une saisie incorrecte (une chaine de cararctère ou d'un entier quand j'ai besoin d'un caractère) fait entrer le programme en boucle infinie.
pour cela , pourrez-vous me donner la solution la plus simple pour ce problème?
et merci .








Salut,
Avec scanf,une saisie incorrecte (une chaine de cararctère ou d'un entier quand j'ai besoin d'un caractère) fait entrer le programme en boucle infinie.
pour cela , pourrez-vous me donner la solution la plus simple pour ce problème?
et merci .
Tu vérifies le retour de la fonction scanf ? Elle t'indique si elle a réussie à parser la ligne.
Il semble quand même que tout le monde déconseille l'utilisation de scanf. Tu as d'autres alternatives (plus lourdes à mettre en oeuvre) avec les strtol, strtod etc. Pour les utiliser tu découpes ta chaîne et tu traites chaque morceau avec ces fonctions.
Déjà il y a une rubrique spécifique C dans ce forum.
Le problème de scanf c'est qu'il attend une chaine formatée et que l'utilisateur, lui, tape n'importe quoi. Et tout ce qui ne correspond pas à l'élément attendu reste alors dans le buffer clavier (stdin) et ça bloque ensuite les saisies suivantes.
Exemple
Ce simple code ne fonctionnera pas comme tu t'y attends car le scanf("%d") ne récupèrera pas le <retour chariot> tapé lors de la saisie de l'age. Celui-ci reste donc dans le buffer stdin et il est ensuite récupéré par le scanf suivant. Et donc tu peux jamais saisir le nom
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #include <stdio.h> int main() { int age; char nom[255]; printf("Entrez votre age\n"); scanf("%d", &age); printf("Entrez votre nom\n"); scanf("%s", nom); printf("Nom: [%s] - Age: [%d]\n", nom, age); }
La procédure standard est la suivante
1) faire saisir une chaine avec fgets()
2) extraire ce qui t'intéresse de la chaine avec sscanf
3) si sscanf ne renvoie pas le bon nombre d'éléments récupérés, alors erreur de saisie
Exemple
Dans ce cas, le fgets récupère tout ce qu'il y a dans le clavier. Celui-ci reste donc clean pour la saisie suivante. Ensuite c'est sscanf qui informe d'un problème éventuel. Et cette façon de faire peut facilement être adaptée aux doubles...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 #include <stdio.h> int main() { char saisie[255]; int age; char nom[255]; while(1) { printf("Entrez votre age\n"); fgets(saisie, 255, stdin); if (sscanf(saisie, "%d", &age) == 1) break; printf("Erreur - Saisie incorrecte - Recommencez...\n"); } printf("Entrez votre nom\n"); fgets(nom, 255, stdin); printf("Nom: [%s] - Age: [%d]\n", nom, age); }
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]








il reste un seul petit problème dans le test de saisie.
c'est que par exemple,j'accepte dans mon programme la touche n pour une nouvelle partie
mais en tapant "njzghigze..." cette saisie sera accepté et on entre ds une nouvelle partie ,alors quelle est la slution s'il vous plait?
et merci.
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 while(1) { printf("Entrez n pour une nouvelle partie?\n"); fgets(saisie, 255, stdin); if (strcmp(saisie, "n\n") == 0) break; printf("Erreur - Saisie incorrecte - Recommencez...\n"); }
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Partager