Switch case et gets

cs_fab30 Messages postés 48 Date d'inscription vendredi 14 juin 2002 Statut Membre Dernière intervention 9 août 2009 - 22 avril 2004 à 07:22
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 - 24 avril 2004 à 10:02
Bonjour, je travaille avec Dev c++ et lorsque que fait un prog contenant un gets dans un switch case ou dans une fonction appelée depuis un switch case, et bien le gets se fait sauter et le compilateur passe directement a la ligne en dessous !!! pourquoi ?
Exemple :

int main(){
char * texte;
int choix;
printf("Veuillez taper un texte : ");
// le gets marche
gets(texte);
while (choix!=0){
system("cls");
printf(" 1 ) Fonction 1\n");
printf(" 2 ) Fonction 2\n");
printf(" 0 ) Sortie 2\n");
scanf("%d", &choix);
switch (choix){
case 1 : printf("Veuillez taper un texte : ");
// le gets ne marche pas
gets(texte);
Fonction1();
break;
case 2 : Fonction2();
case 0 : printf("Fin du programme\n");
break;
default : printf("erreur de saisie");
}
}
system("PAUSE");
return 0;
}

Si vous voyer une solution...

----fab30----
A voir également:

14 réponses

frdestroyers27 Messages postés 93 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 19 avril 2008
22 avril 2004 à 08:06
Si je me souvient bien c'est pas une bonne idee d'utiliser un
gets apres avoir utiliser un scanf si tu doit le faire quand meme...essaie de mettre un gets() null exemple
gets();
gets(texte);

Destroyers27
0
frdestroyers27 Messages postés 93 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 19 avril 2008
22 avril 2004 à 08:10
juste dememe pourquoi n'utilise tu pas getch ou getche a la place de ton scanf?

Destroyers27
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
22 avril 2004 à 08:32
attend, texte c'est un pointeur sur un caractere, tu ve saisir koi dessus? faut allouer, mais fait plutot un tableau statique, dynamique ca sert a rien pour une poigné d'octet

oubli pas fflush(stdout) avant une saisie, et pas de commentaires "//" en c ansi, utilise /* */

#include <stdio.h>
int main(){
char texte[200];
int choix;
printf("Veuillez taper un texte : ");
fflush(stdout);
scanf("%s",texte);
while (choix!=0){
system("cls");
printf(" 1 ) Fonction 1\n");
printf(" 2 ) Fonction 2\n");
printf(" 0 ) Sortie 2\n");
scanf("%d", &choix);
switch (choix){
case 1 : printf("Veuillez taper un texte : ");
fflush(stdout);
scanf("%s",texte);
Fonction1();
break;

case 2 : Fonction2();

case 0 : printf("Fin du programme\n");
break;

default : printf("erreur de saisie");
}
}
getchar();
return 0;
}
0
cs_fab30 Messages postés 48 Date d'inscription vendredi 14 juin 2002 Statut Membre Dernière intervention 9 août 2009
22 avril 2004 à 10:52
En fait, j'ai pas besoin d'allouer la memoire pour char * texte, c le fait pour moi (ca marche bien). Je veux absolument utiliser un gets parce qu'il permet la saisie des espaces alors que scanf ne le fais pas. Par contre, je suis particulierement interressé par fflush(stdout); elle fait quoi exactement ? elle vide le buffer ?
----fab30----
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
22 avril 2004 à 12:04
djl -> c'est pas plûtot un fflush(stdin) ?
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
22 avril 2004 à 15:12
a la place de get tu peux aussi utiliser read, qui prendra aussi les espaces
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
22 avril 2004 à 15:17
par contre il faudra bien mettre le zero final:

#include 
....
char b[100];
int n = read(0, b, 100);
b[n] = 0;
puts(b);
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
22 avril 2004 à 19:49
ymca2003 ==> non, avant une saisie c'est stdout que tu dois vider pour etre sur que sont contenu soit afficher

ne fait JAMAIS fflush(stdin), ca a un effet indefinit (je cite k&r ansi)
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
22 avril 2004 à 22:47
OK merci.
0
cs_fab30 Messages postés 48 Date d'inscription vendredi 14 juin 2002 Statut Membre Dernière intervention 9 août 2009
23 avril 2004 à 06:56
Et bien, apres avoir fais un fflush(stdout), j'ai un message d'erreur. Alors j'ai essayé le fflush(stdin) et la mon probleme s'est reglé. C'est pas le fflush(stdout) qui a un effet indefini ?

----fab30----
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
23 avril 2004 à 08:01
encore une fois, fflush ne s'utilise UNIQUEMENT sur un output stream

K&R ansi, Appendix B 1.1
"on an input stream, the effect is undefined."

ca doit venir de ton code

deja si tu aloue pas ton char* ya violation d'adresse, suffit pas que ca compile ou que ca marche, tu comprend que c'est juste un pointeur?
0
cs_fab30 Messages postés 48 Date d'inscription vendredi 14 juin 2002 Statut Membre Dernière intervention 9 août 2009
24 avril 2004 à 08:59
Bien sur que je comprend que c'est juste un pointeur de caractere. Normalement, il pointe vers la premiere lettre de ma chaine de caractere. Je ne fais pas de malloc parce qu'il me semblait que gets le faisait implicitement. Pour le fflush, tu a vu mon code source, et je vais suivre tes conseils, a savoir ne pas utiliser de scanf pour afficher que du texte, et l'utiliser a la place de mon gets pour la saisi de chaine de caractere. Seulement, si j'ai choisi d'utiliser un gets plutot qu'un scanf pour la saisi de caracteres, c'est qu'avec le gets l'utilisateur peut saisir le caractere espace, alors qu'avec le scanf c'est impossible. As tu une solution pour remedier a cela ?
----fab30----
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
24 avril 2004 à 09:49
oui c'est vrai pour le gets, mais gets n'alloue ta chaine

voici a quoi peut ressembler une implementation de gets

char *gets(s)
char s[];
{
register c;
register char *ts;

ts=s;

while( ( c=getc(stdin) )!=EOF )
if( (*ts++=c)=='\n') break;

*ts=0;

return ( c==EOF && ts==s )?NULL:s;
}

pas d'allocation
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
24 avril 2004 à 10:02
en fait utilise plutot gets pour saisir des chaines de caractere, scanf pour le reste
0
Rejoignez-nous