#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;
}
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
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.
Hors 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
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
Cette solution trouvé par pinguinux marche aussi.
Je n'ai jamais dit le contraire
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
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)
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
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
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
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.
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