int main()
{
int a;
char c;
printf("Indiquez le prix hors taxe d'un produit : ");
rewind(stdin);
scanf("%d",&a);
printf("Indiquez en minuscule la categorie du produit a pour 5.5 b pour 20: ");
rewind(stdin);
c = getchar();
printf("Character entered: ");
putchar(c);
return 0;
}
Le problème c'est que le programme s'exécute sans jamais me demander d'entrer le caractère c (je l'ai pourtant demandé avec l'instruction getchar).
lorsque j'utilise un scanf à la place tout se passe très bien de même si j'utilise le programme suivant
#include <stdio.h>
int main () {
char c;
printf("Enter character: ");
c = getchar();
printf("Character entered: ");
putchar(c);
return(0);
}
Alors tout se passe très bien aussi.
Du coup pourquoi ça marche pas ? Vraiment là je sèche !Merci de m'avoir lue !
rewind(stdin) n'est pas une utilisation standard. Il peut y a voir de drôles de surprises. Où as-tu vu cette utilisation de cette fonction ?
getchar() lit un caractère de l'entrée standard. Le soucis c'est qu'il y a un '\n' ou un "\r\n" après la lecture de ton prix (puisque tu est revenu à la ligne pour terminer la saisie)
test que sans les rewind(stdin) et en marquant pour la première saisie "1000b" , tu auras 1000 pour le prix et 'b' comme catégorie.
Un petit code pour vidéer stdin et de manière standard. Le lit les caractères tant que je n'ai pas lu '\n' ou bien que j'ai atteint la fin du flux.
void purge_stdin()
{
int c;
do
{
c=getchar();//je lis un caractère et getchar renvoie un int ( sinon je ne peux pas récupérer EOF pour EndOfFile )
}
while (c != '\n' && c != EOF);
}
Si je comprends bien getchar prend un caractère inséré même si celui si ne vient pas de l'appel de getchar lui même (ça j'avoue que j'ai du mal à saisir) ? En fait c'est comme si il lisait la ligne sur ce fameux fichier stdin et en retirait la caractère ?
D'ailleurs ou je me trompe ou ton bout de code permet de lire une nouvelle ligne pas d’effacer l’ancienne ? Tu me fais prendre conscience que je comprends pas du tout ce fichier stdin..
PS; j'ai vue rewind(stdin) dans un livre (Langage C Maîtriser la programmation procédurale). Après j'ai probablement pas compris ce que voulait me dire l'auteur.
Je ne mettrai pas ça comme un problème d'espacement.
123345
combien de nombre ? 1 seul. si tu demandes 2 nombre , il en manquera fatalement 1.
Si maintenant à la place d'un nombre décimal , il y a autre chose. (il y a ici une erreur)
Bob
scanf("%d",&val);//que va-t-il se passer ?
scanf ignore les caractère d'espacement, mais une lettre, un chiffre, une ponctuation,etc... ne sont pas des caractères d'espacement et ne seront pas ignorés. De plus, scanf retourne le nombre de variable correctement lu. ( et donc dans mon cas , il retournera 0 car rien n'aura été correctement lu)
Dans ce cas , val ne sera pas modifié, et tout se passera comme si stdin n'avait pas été lu.
Si maintenant j'écrits
//contenu qui sera dans stdin
123 345\n
scanf("%d%d",&a,&b);//a=123 et b=345 aucun problème.
- Edité par neuneutrinos 16 janvier 2020 à 9:58:45
Quand on fait une lecture (scanf, getchar, ...) sur le terminal, l'utilisateur tape une LIGNE.
Cette ligne est gardée quelque part, dans une zone tampon, et "consommée" par les lectures qu'on fait. Quand on est arrivé au bout, l'utiisateur a l'occasion de taper une nouvelle ligne.
bref, quand on a fait un scanf("%d", &nombre), il reste dans le tampon le caractère de fin de ligne.
- Edité par michelbillaud 16 janvier 2020 à 12:18:24
getchar && putchar + scanf
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.