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.

#1 Le 29/07/2019, à 16:54

zephyre123

La fonction scanf ne marche pas deux fois

Bonjour,

Je suis débutant en programmation c et je me lance.
Mais a peine commencer je rencontre deja un problème pourtant le code est très simple mais je ne trouve pas pourquoi la fonction scanf ne marche pas deux fois.
Je suis les cours sur utube de jason champagne ici https://www.youtube.com/watch?v=I9xlZGD … 4j&index=4
J'ai modifié un peu le programme et cela ne fonctionne pas.

Voici le code tout bête :

1 #include <stdio.h>
  2 int main(void)
  3 {
  4         int ageUtilisateur = 0;
  5         signed char lettre = 'A';
  6 
  7         printf ("Quel age avez vous ?\n");
  8         scanf("%d", &ageUtilisateur);
  9         printf ("Vous avez %d ans\n", ageUtilisateur);
 10 
 11         printf("Entrer une lettre svp !\n");
 12         scanf("%c", &lettre);
 13         printf("Vous avez entre la lettre %c\n", lettre);
 14 
 15         return 0;
 16 }

Le souci c'est que j'ai le retour suivant lorsque je compile. L'ordinateur ne me demande pas de saisir une lettre

Quel age avez vous ?
25
Vous avez 25 ans
Entrer une lettre svp !
Vous avez entre la lettre

Le plus bizarre c'est lorsque je mets de commentaires sur le premier scanf il me demande bien la lettre.
Je ne comprends pas.

Dernière modification par zephyre123 (Le 29/07/2019, à 16:57)

Hors ligne

#2 Le 29/07/2019, à 17:13

pingouinux

Re : La fonction scanf ne marche pas deux fois

Bonjour,
Je ne suis pas spécialiste, mais ceci semble marcher :

        scanf("%d\n", &ageUtilisateur);

Hors ligne

#3 Le 29/07/2019, à 17:44

zephyre123

Re : La fonction scanf ne marche pas deux fois

Salut pingouinux oui mais il ne prends pas en compte le deuxieme scanf.
L'ordinateur ne me demande pas une lettre a saisir au clavier.
Mais il me demande bien l'age.

Hors ligne

#4 Le 29/07/2019, à 18:22

pingouinux

Re : La fonction scanf ne marche pas deux fois

Tu as raison, j'ai mal testé, désolé…

Hors ligne

#5 Le 29/07/2019, à 19:15

pingouinux

Re : La fonction scanf ne marche pas deux fois

Bon, j'ai trouvé ceci : http://sdz.tdct.org/sdz/la-saisie-secur … scanf.html.

#include <stdio.h>
int main(void)
{
         int ageUtilisateur = 0;
         signed char lettre = 'A';

         printf ("Quel age avez vous ?\n");
         scanf("%d", &ageUtilisateur);
         scanf ("%*[^\n]");
         getchar ();
         printf ("Vous avez %d ans\n", ageUtilisateur);
 
         printf("Entrer une lettre svp !\n");
         scanf("%c", &lettre);
         scanf ("%*[^\n]");
         getchar ();
         printf("Vous avez entre la lettre <%c>\n", lettre);

         return 0;
}

Hors ligne

#6 Le 29/07/2019, à 20:24

zephyre123

Re : La fonction scanf ne marche pas deux fois

pinguinux peut tu m'expliquer je n'y comprends rien stp

Hors ligne

#7 Le 29/07/2019, à 21:07

NicoApi73

Re : La fonction scanf ne marche pas deux fois

Bonjour,

#include <stdio.h>

int main()
{
	int ageUtilisateur = 0;
	char lettre;

	printf ("Quel age avez vous ?\n");
	scanf("%d", &ageUtilisateur);
	printf ("Vous avez %d ans\n", ageUtilisateur);
	
	printf("Entrer une lettre svp !\n");
	scanf(" %c", &lettre);
	printf("Vous avez entre la lettre %c\n", lettre);
	
	return 0;
}
man a écrit :

c

Matches a sequence of characters whose length is specified by the maximum field width (default 1); the next pointer must be a pointer to char, and there must be enough room for all the characters (no terminating null byte is added). The usual skip of leading white space is suppressed. To skip white space first, use an explicit space in the format.

Honnêtement, j'ai passé du temps pour trouver et comprendre smile

EDIT : tu n'as pas ce problème si tu passes par une chaine de caractères :

#include <stdio.h>

int main()
{
	int ageUtilisateur = 0;
	char lettre[2];

	printf ("Quel age avez vous ?\n");
	scanf("%d", &ageUtilisateur);
	printf ("Vous avez %d ans\n", ageUtilisateur);
	
	printf("Entrer une lettre svp !\n");
	scanf("%1s", lettre);
	printf("Vous avez entre la lettre %s\n", lettre);
	
	return 0;
}

sinon tu as cette variante là pour virer le 1er caractère leading white space :

#include <stdio.h>

int main()
{
	int ageUtilisateur = 0;
	char lettre;

	printf ("Quel age avez vous ?\n");
	scanf("%d", &ageUtilisateur);
	printf ("Vous avez %d ans\n ", ageUtilisateur);
	
	printf("Entrer une lettre svp !\n");
	scanf("%*c %c", &lettre);
	printf("Vous avez entre la lettre %c \n", lettre);
	
	return 0;
}

Dernière modification par NicoApi73 (Le 30/07/2019, à 07:26)

Hors ligne

#8 Le 29/07/2019, à 22:35

zephyre123

Re : La fonction scanf ne marche pas deux fois

Nico peut tu m'expliquer stp je ne comprends rien a ce que tu fais

Hors ligne

#9 Le 29/07/2019, à 22:53

Watael

Re : La fonction scanf ne marche pas deux fois

j'ai passé du temps pour trouver et comprendre

justement, qu'as-tu compris ?


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#10 Le 29/07/2019, à 23:14

NicoApi73

Re : La fonction scanf ne marche pas deux fois

L'option %c lit les caractères qu'il stocke dans le pointeur passé en argument, sans supprimer les "white-space" et en particulier, sans supprimer le leading white space. Les white-spaces incluent les espaces, form-feed ('\f'), newline ('\n'), carriage return ('\r'), horizontal tab ('\t'), et vertical tab ('\v')

Quand tu saisies le nombre, il y a un retour à la ligne qui reste dans le tampon (ça je ne sais pas te l'expliquer, je pense que ça vient de la touche Entrée une fois que tu as saisies le nombre) donc quand tu fais scanf ("%c",&lettre) il met ce qui reste dans le tampon dans lettre, à savoir un retour à la ligne.
Si tu mets scanf (" %c",&lettre), tu lui indiques de ne pas tenir compte des white-spaces, donc le retour à la ligne n'est pas pris en compte et la lettre l'est. de ne pas prendre en compte le leading white space, donc le caractère suivant est pris, à savoir la lettre

Si tu avais utilisé une chaine de caractères (tableau de caractères), avec l'option de conversion %s, celle-ci par défaut supprime les white-spaces (donc le leading white space), et donc pas de problème.

Idem, si tu lui spécifies de ne pas prendre en compte le premier caractère scanf("%*c %c", &lettre);. EDIT : cette méthode à l'inconvénient que s'il n'y a rien dans le tampon, elle demande un caractère qui n'est pas pris en compte...

En doc, tu as :

man scanf

ou
https://linux.die.net/man/3/scanf

Dernière modification par NicoApi73 (Le 30/07/2019, à 07:29)

Hors ligne

#11 Le 29/07/2019, à 23:37

zephyre123

Re : La fonction scanf ne marche pas deux fois

Moi ce que j'ai compris c'est qu'il faut vider le tampon apres chaque appel de la fonction scanf mais je ne comprends pas pourquoi la ligne de code ci dessous vide le tampon.

while ( (c = getchar() ) != '\n' && c != EOF)

je ne comprends pas pourquoi cette ligne de code vide le tampon et d'ailleurs je ne vois même pas ce que c'est qu'un tampon.
Le buffer je le vois comme une zone mémoire intermédiaire avant de passer en écriture es ce que c'est ça ?
La fonction getchar() lit l'entree standart autrement dit le clavier.
Mais à aucun moment je ne tape de retour chariot ou de End Of File donc je devrai boucler à l'infini.

Nico je crois qu'il y a une erreur dans ton raisonnement.
Pour les chaines de caractere je devrai avoir également un retour chariot qui se balade dans le buffer.
Bref pour moi c'est pas clair du tout

J'ai recommencer deux scanf de suite avec le type int pour les deux je n'ai aucun probleme.
Pas de \n qui se balade dans le buffer.Bizarre non ?
Pourquoi c'est uniquement lorsque je mets un caractere que le \n est prit dans le buffer ?

Dernière modification par zephyre123 (Le 29/07/2019, à 23:52)

Hors ligne

#12 Le 29/07/2019, à 23:42

NicoApi73

Re : La fonction scanf ne marche pas deux fois

zephyre123 a écrit :
while ( (c = getchar() ) != '\n' && c != EOF)

Ne sors pas une ligne de son contexte STP. Donne moi le code complet.

Ici, tu lis le tampon tant que le caractère est différent du retour à la ligne ET différent de EOF (End Of File)

Dernière modification par NicoApi73 (Le 30/07/2019, à 13:32)

Hors ligne

#13 Le 29/07/2019, à 23:55

zephyre123

Re : La fonction scanf ne marche pas deux fois

Cette solution trouvé par pinguinux marche aussi.

 1 #include <stdio.h>
  2 int main(void)
  3 {
  4         int ageUtilisateur = 0;
  5         int poid = 0;
  6         signed char lettre = 'A';
  7         int c;
  8 
  9 //      printf("quel age avez vous ?\n");
 10 //      scanf("%d", &ageUtilisateur);
 11 //      printf(" vous avez %d ans\n", ageUtilisateur);
 12 //      
 13 //      printf("Quelle est votre poid ?\n");
 14 //      scanf("%d", &poid);
 15 //      printf("Vous pesez %d\n", poid);
 16 
 17 
 18         printf ("Quel age avez vous ?");
 19         scanf("%3d", &ageUtilisateur);
 20         // Vidage du buffer
 21         while ((c = getchar () ) != '\n'&& c != EOF);
 22         printf ("Vous avez %d ans\n", ageUtilisateur);
 23 
 24         printf("Entrer une lettre svp !\n");
 25         scanf("%c", &lettre);
 26         printf("Vous avez entre la lettre %c\n", lettre);
 27 
 28         while ((c = getchar ()) != '\n' && c != EOF);
 29 
 30         return 0;
 31 }

Hors ligne

#14 Le 30/07/2019, à 00:03

NicoApi73

Re : La fonction scanf ne marche pas deux fois

zephyre123 a écrit :

Cette solution trouvé par pinguinux marche aussi.

Je n'ai jamais dit le contraire smile

A toi d'exploiter ce qui t'est mis à disposition. Les informations se trouvent dans le manuel (commande man + le nom de la fonction, par exemple man scanf)

Hors ligne

#15 Le 30/07/2019, à 00:25

kamaris

Re : La fonction scanf ne marche pas deux fois

zephyre123 a écrit :

J'ai recommencer deux scanf de suite avec le type int pour les deux je n'ai aucun probleme.

Sauf si, par inadvertance, tu donnes à manger à ton premier int une lettre au lieu d'un chiffre (ce que s'empresserait de faire tout bon utilisateur lambda) wink

Tu peux d'ailleurs aussi essayer de limiter le nombre de chiffres pris en compte dans le premier int, et dépasser ce nombre lors de la saisie. Par exemple :

scanf("%2d", &ageUtilisateur);

et tu rentres un âge à trois chiffres (ou plus).

Dans ces deux cas, ton second int ne se comportera pas comme prévu.

Hors ligne

#16 Le 30/07/2019, à 05:57

pingouinux

Re : La fonction scanf ne marche pas deux fois

zephyre123 #6 a écrit :

pinguinux peut tu m'expliquer je n'y comprends rien stp

J'ai trouvé cette méthode dans le lien que je donne en #5, mais j'avoue que ce n'est pas limpide pour moi.

Hors ligne

#17 Le 30/07/2019, à 06:02

NicoApi73

Re : La fonction scanf ne marche pas deux fois

zephyre123 a écrit :

Nico je crois qu'il y a une erreur dans ton raisonnement.
Pour les chaines de caractere je devrai avoir également un retour chariot qui se balade dans le buffer.
Bref pour moi c'est pas clair du tout

man a écrit :

s

Matches a sequence of non-white-space characters; the next pointer must be a pointer to character array that is long enough to hold the input sequence and the terminating null byte ('\0'), which is added automatically. The input string stops at white space or at the maximum field width, whichever occurs first.

Lis le manuel : dans le cas d'une chaine de caractères, les saisies sont découpées en utilisant les white-space et les leading white space sont supprimés...

https://cboard.cprogramming.com/c-progr … scanf.html
A priori scanf récupère un "leading white space", qui est supprimé avec quasiment toutes les conversions, sauf certains dont %c. C'est ce leading white space qu'il faut virer... J'ai corrigé les quelques conneries que j'ai écrit dans les posts précédents.

zephyre123 a écrit :

J'ai recommencer deux scanf de suite avec le type int pour les deux je n'ai aucun probleme.
Pas de \n qui se balade dans le buffer.Bizarre non ?
Pourquoi c'est uniquement lorsque je mets un caractere que le \n est prit dans le buffer ?

C'est normal, la conversion %d supprime le leading white space...

Dernière modification par NicoApi73 (Le 30/07/2019, à 20:21)

Hors ligne

#18 Le 03/08/2019, à 17:21

NicoApi73

Re : La fonction scanf ne marche pas deux fois

Bonjour,

J'ai regardé la vidéo que tu cites au #1. Pour débuter, ce n'est pas mal.

Tu peux compléter avec ce cours : https://openclassrooms.com/fr/courses/1 … ammer-en-c Je l'ai trouvé car grâce à ta vidéo, j'ai découvert la SDL et le cours OpenClassRoom l'utilise également. Tu trouveras de la redite, mais ça te permettra de mieux maîtriser.

Tu pourras ensuite le compléter avec ce cours là : https://openclassrooms.com/fr/courses/1 … -langage-c

L'ensemble de ces cours permettent de débuter et en plus permettent d'accéder à du développement d'interfaces graphiques (fenêtrées ou non). Ca ne reste néanmoins que de l'initiation. Je n'ai pas trouvé de bouquin spécifiquement sur la SDL, par contre il en existe un sur Qt (alors que ça représente un chapitre dans le dernier livre que j'ai cité...)

Hors ligne

#19 Le 03/08/2019, à 19:12

grigouille

Re : La fonction scanf ne marche pas deux fois

Ton code fonctionne :

$ ./toto 
Quel age avez vous ?
29@
Vous avez 29 ans
Entrer une lettre svp !
Vous avez entre la lettre @
$ 

Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne