Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#26 Le 29/09/2019, à 18:26

chris7522

Re : Ca ne se passe comme je le souhaiterai (C)

Bonsoir a toutes et a tous ,
Dans le code on m'a suggéré de remplacer :

 printf("Quel est votre choix?\n");
 scanf("%d",&choix);
while((choix!=1)&&(choix!=2))
   {
    printf("Mauvais choix,recommencez\n");
    scanf("%d",&choix);
   }

Par :

while (1) {
	choix=saisieInt("Quel est votre choix?");
	if (choix >=1 && choix <=2) break;
	printf("Mauvais choix,recommencez\n");
}

Et bien sur , de rajouter la fonction :

int saisieInt(char *prompt) {
	char saisie[100];
	int nb;
	while (1) {
		fputs(prompt, stdout);
		fflush(stdout);
		fgets(saisie, 100, stdin);
		if (sscanf(saisie, "%d", &nb) == 1) break;
		fputs("Mauvaise saisie - Recommencez !!!\n", stdout);
	}
	return nb;
}

  Mon cerf-volent ne m'aidant pas vraiment,  je ne comprends pas le fonctionnement de la fonction saisieInt et l'intéret de ce genre d'instruction .
  Merci de votre aide

Hors ligne

#27 Le 29/09/2019, à 19:38

NicoApi73

Re : Ca ne se passe comme je le souhaiterai (C)

Qu'est ce que tu ne comprends pas dans la fonction saisieInt?
stdout est la sortie standard (l'écran), stdin est l'entrée standard (le clavier)

sscanf prend une chaine en entrée au lieu de l'entrée standard et retourne le nombre d'éléments qui ont été converti (0, 1 ou EOF dans le cas c-dessus)

Hors ligne

#28 Le 29/09/2019, à 20:56

chris7522

Re : Ca ne se passe comme je le souhaiterai (C)

NicoApi73 a écrit :

Qu'est ce que tu ne comprends pas dans la fonction saisieInt?
stdout est la sortie standard (l'écran), stdin est l'entrée standard (le clavier)

sscanf prend une chaine en entrée au lieu de l'entrée standard et retourne le nombre d'éléments qui ont été converti (0, 1 ou EOF dans le cas c-dessus)

C'est cette partie que je ne comprends pas , qu'est ce qui se passe vraiment ?
Je comprends le fonctionnement de sscanf . Suite a la question : Quel est votre choix ? La personne devrai entrer logiquement un 1 ou un 2 et ensuite tu me parles de retour d'éléments et de conversion . C'est la que je ne comprends pas . Mes lacunes sont peut etre  trop importantes pour que je puisse comprendre .

Hors ligne

#29 Le 30/09/2019, à 06:40

NicoApi73

Re : Ca ne se passe comme je le souhaiterai (C)

Bonjour,

fputs envoie prompt vers stdout
fflush force le tampon stdout à se vider
fgets prend au maximum 99 (100-1) caractères de stdin et les met dans la chaine passée en argument
sscanf convertit la chaine passée en argument

Hors ligne

#30 Le 01/10/2019, à 16:20

DonutMan75

Re : Ca ne se passe comme je le souhaiterai (C)

Hello chris7522,
voici un exemple du couple fgets/sscanf (inspiré du livre "Développement Système sous Linux")

char ligne[128];

do {
	printf("Quel est votre choix?\n");
	if (fgets(ligne, 128, stdin) == NULL)
		return EXIT_FAILURE;
} while (sscanf(ligne, "%d", &choix) != 1);

printf("Ok, vous avez saisi : %d\n", choix);

Explications :
- fgets lit l'entrée standard jusqu'à rencontrer un saut de ligne ('\n') ou jusqu'à avoir lu au maximum 128 caractères (ceci afin d'éventuel tout débordement)
- fgets stocke la chaîne ainsi lue dans la variable ligne
- cette variable est ensuite passé à sscanf qui la parse pour trouver exactement un entier
- la valeur de retour de sscanf représente le nombre de paramètres correctement parsés (donc ici un seul si ligne est bien formattée et 0 sinon)
- tant que la valeur de retour de sscanf n'est pas de 1, cela signifie que "ligne" ne peut pas être interpréter comme un entier ==> on boucle

Il y a peut-être d'autres raffinements mais là on évite déjà la remise du caractère de scanf.

Bonne journée à tous,

Donut

Hors ligne

#31 Le 02/10/2019, à 09:06

NicoApi73

Re : Ca ne se passe comme je le souhaiterai (C)

Salut DonutMan75,

L'édition 5 du livre "Développement Système sous Linux" paraît demain, l'édition 4 étant épuisée.

Hors ligne

#32 Le 03/10/2019, à 15:47

chris7522

Re : Ca ne se passe comme je le souhaiterai (C)

Merci Donutman75 , mais j'aurai aussi aimé contraindre la personne a faire soit le choix 1 ou 2 .
Est il possible de rajouter une seconde condition au while , du genre :

while((sscanf(ligne,"%d",&choix)!=1)&&(choix!=1&&choix!=2));

Dernière modification par chris7522 (Le 03/10/2019, à 17:06)

Hors ligne

#33 Le 03/10/2019, à 18:43

NicoApi73

Re : Ca ne se passe comme je le souhaiterai (C)

Bonjour,

while (sscanf(ligne, "%d", &choix) != 1)

est sans rapport avec le choix. On s'assure que sscanf a trouvé un entier.

La valeur à comparer à 1 ou 2 est choix

EDIT : DonutMan75 l'avait lui même indiqué :

DonutMan75 a écrit :

- tant que la valeur de retour de sscanf n'est pas de 1, cela signifie que "ligne" ne peut pas être interpréter comme un entier ==> on boucle

EDIT 2 :j'ai lu trop rapidement ton code.
Oui il est possible de rajouter une condition supplémentaire, par contre il faut impérativement que sscanf(ligne, "%d", &choix) soit évalué en premier.

EDIT 3 : La bonne condition est :

do 
...
while((sscanf(ligne,"%d",&choix)!=1)||(choix!=1&&choix!=2));

Dernière modification par NicoApi73 (Le 03/10/2019, à 19:09)

Hors ligne

#34 Le 03/10/2019, à 20:46

chris7522

Re : Ca ne se passe comme je le souhaiterai (C)

Parfait et encore merci !
Une derniere chose sur l'utilité et l'utilisation de "  return EXIT_FAILURE;  "
Je vais surement dire des betises mais , return -1 ne ferai pas la meme chose ?
Si on utilise return EXIT_FAILURE; , il faut le declarer avant avec un #define EXIT_FAILURE ...?
Je maitrise pas ce point .

Hors ligne

#35 Le 03/10/2019, à 20:53

NicoApi73

Re : Ca ne se passe comme je le souhaiterai (C)

chris7522 a écrit :

Si on utilise return EXIT_FAILURE; , il faut le declarer avant avec un #define EXIT_FAILURE ...?

Non : #include <stdlib.h>

Hors ligne