[langage C] Problème avec un fgets

Fermé
Rykyu - 7 mars 2008 à 21:21
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 - 7 mars 2008 à 22:50
Bonjour. Voilà, je débute en C et je me lance dans un petit programme pour le fun. Il s'agit d'un de ces programmes à la mode qui recherche des mots dans les phrases que vous répondez pour faire comme s'il comprenait tout. Donc pour ce qui est de trouver le mot, ça n'est pas un soucis, je fais la recherche d'une chaîne dans une autre.
Le soucis, c'est pour que l'utilisateur écrive sa phrase. Comme tout le monde, j'ai été confronté au
scanf("%s", tableau);
qui s'arrête au premier espace venu.
Pour palier à ce problème, j'ai trouvé sur le net deux méthodes.
La première consiste à modifier le scanf :
scanf("%[^\n]", tableau);
La seconde a utiliser un fgets :
fgets(tableau, 100, stdin);

Cependant il arrive quelque chose d'étrange...
En fait je fais une boucle de réponse, et j'adapte la réponse de l'ordinateur en fonction des mots trouvés (vous allez vite comprendre en voyant le code).
Le soucis, c'est que quand il y a le cas "presenter", et bien le programme exécute le fgets en vidant le tableau de reponses sans rien demander... Ensuite, il relance la boucle et tombe donc sur le else.
Ce qui m'embête, c'est que ça ne fait ça que pour le cas "presenter", le "Et maintenant" suivit du fgets marche très bien dans les deux autres cas, à savoir qu'il ne se répète pas.
Me suis-je bien fait comprendre ? :P
Merci pour votre aide...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
int continuer = 1;
char reponses[1000];
char pseudo[100];
int age[2];
char *presenter;
char *quitter;
printf("Bonjour. \nVoulez-vous vous presenter a moi ? Ou bien voulez-vous parler tout de suite ?");
fgets(reponses, 1000, stdin);
do
{
presenter = strstr(reponses, "presenter");
quitter = strstr(reponses, "quitter");
if (presenter)
{
printf("\nComment voulez-vous etre appele ?");
scanf("%s", pseudo);
printf("\nD'accord. Quel age avez-vous, %s ?", pseudo);
scanf("%ld", age);
printf("\nEt maintenant ?");
fgets(reponses, 1000, stdin); /* C'est là que ça coince, le fgets ne passe pas, il vide le tableau reponses et relance la boucle, du coup il tombe sur le "else" et là tout marche nickel. */
}
else if (quitter)
{
printf("Au revoir, content de t'avoir parle, %s !", pseudo);
continuer = 0;
}
else
{
printf ("\nJe ne comprend pas ce que vous dites.");
printf("\nEt maintenant ?");
fgets(reponses, 1000, stdin);
}
}while (continuer);
printf("\n");
system("PAUSE");
return 0;
}

Reformulé :
En fait, dans le cas où l'utilisateur utilise le mot "presenter", la machine fait comme si elle avait compris qu'il voulait se présenter, et demande donc des informations sur lui. Une fois fini, elle balance un "et maintenant ?" qui devrait être suivit d'un fgets.
Or ce fgets est bien balancé, mais l'ordinateur y répond tout seul par un vide. La variabel continue restant égale à 1, la boucle reprend. Le tableau reponses est maintenant vide, c'est donc le else qui se lance.

Résultat, une fois la présentation faite, on obtient
"Et maintenant ?
Je ne comprend pas ce que tu veux dire
Et maintenant ?"
Et là tu as enfin le fgets tant attendu. Ce qui signifie que dans le cas du "presenter", le programme ne prend pas le fgets correctement, alors que dans le cas du quitter ou du else, il le prend normalement, et je ne comprend pas pourquoi...
A voir également:

2 réponses

mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
7 mars 2008 à 22:34
en faite c'est un probleme qui arrive souvent ;)
je vais essayer de t'expliquer apres avoir donner l'age tu appuie sur entree donc le caractere '\n' se retrouve stocker dans le tableau reponse a cause du fgets...
la solution c'est de recupérer le '\n' en rajoutant un
getchar();
ou un
fgets(stdin);
juste avant
fgets(reponses, 1000, stdin); 


essaye ça devrait marcher ;)
2
Merci à toi :).
Le fgets(stdin); n'est pas pris par le compilateur, mais le getchar(); fonctionne à merveille :). En fait une amie m'a donné une alternative qui est de remplacer les scanf par des gets, mais grâce à ta réponse, je comprend pourquoi il y avait ce problème, merci beaucoup :).
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
7 mars 2008 à 22:50
ah oui en faite j'ai fait une petite erreur c'est
fgetc(stdin);
et pas
fgets(stdin);
et de rien content de t'avoir aider ;)
1