[C]Des espaces dans les chaines de caractères

Résolu/Fermé
Yuku Messages postés 199 Date d'inscription samedi 22 mars 2008 Statut Membre Dernière intervention 22 mars 2012 - 11 oct. 2008 à 18:36
Yuku Messages postés 199 Date d'inscription samedi 22 mars 2008 Statut Membre Dernière intervention 22 mars 2012 - 11 oct. 2008 à 19:21
Bonjour à tous.

Je suis débutant en programmation et je me posais une question vis à vis d'un petit code que j'ai mis au point, tout simple, qui comme dans le début du jeu Pokémon demande à l'utilisateur son nom, celui de son adversaire, et où il habite.
Le hic est que le programme fonctionne correctement, sauf lorsque l'on rentre un nom composé sans tiret.
Par exemple, il y aura un problème si l'on rentre Jean Charles : seul Jean sera retenu par le programme.
Voici le code source :

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

using namespace std;

int main(int argc, char *argv[])
{
char util[10], adversaire[10], OHV[35]; //Initialisation des chaines de caractères.
char choix; //Initialisation de la variable choix (%c car O[oui] ou N[non]).

do{
printf("\nComment vous appelez-vous?\t");
scanf("%s", util); //L'utilisateur informe de son nom.
fflush(stdin); //Nettoyage du buffer pour éviter des problèmes avec scanf.
printf("\nVous vous appelez donc %s ? (O=Oui, N=Non)\t", util);
scanf("%c", &choix);
if(choix=='O' && choix!='N')
{
printf("\nD'accord, votre nom est donc ");
}
}while(choix=='N'); //Boucle qui se répète tant que le choix n'est pas correct.
printf("%s !\n\n", util);

do{
printf("\nLe nom de votre rival?\t\t");
scanf("%s", adversaire);
fflush(stdin);
printf("\nVotre rival est donc %s ? (O=Oui, N=Non)\t", adversaire);
scanf("%c", &choix);
if(choix=='O' && choix!='N')
{
printf("\nAh mais oui, c'est ");
}
}while(choix=='N');
printf("%s votre rival!\n\n", adversaire);

do{
printf("\nEt ou habitez-vous?\t\t");
scanf("%s", OHV);
fflush(stdin);
printf("\nVous habitez donc a %s ? (O=Oui, N=Non) ?\t", OHV);
scanf("%c", &choix);
if(choix=='O' && choix!='N')
{
printf("\nVous etes donc ");
}
}while(choix=='N');
printf("%s, de %s !\n\n\n", util, OHV);

system("PAUSE");
return 0;
}


Question subsidiaire : comment faire en sorte d'avoir juste un petit tiret clignotant à la suite du texte (et donc attente que l'utilisateur appuie sur Entrée pour continuer), plutôt que d'afficher à chaque fois "Appuyez sur une touche pour continuer"?
(je travaille sous Dev-C++).

Merci d'avance !
A voir également:

6 réponses

mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
11 oct. 2008 à 19:06
hum...je vois l'erreur tu as oublier de vider le buffer apres tes scanf de choix...
essaye ça
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

//using namespace std;

int main(int argc, char *argv[])
{
char util[10], adversaire[10], OHV[35]; //Initialisation des chaines de caractères.
char choix; //Initialisation de la variable choix (%c car O[oui] ou N[non]).

do{
printf("\nComment vous appelez-vous?\t");
fgets(util,10,stdin); //L'utilisateur informe de son nom.
fflush(stdin); //Nettoyage du buffer pour éviter des problèmes avec scanf.
printf("\nVous vous appelez donc %s ? (O=Oui, N=Non)\t", util);
scanf("%c", &choix);
fflush(stdin);
if(choix=='O' && choix!='N')
{
printf("\nD'accord, votre nom est donc ");
}
}while(choix=='N'); //Boucle qui se répète tant que le choix n'est pas correct.
printf("%s !\n\n", util);

do{
printf("\nLe nom de votre rival?\t\t");
fgets(adversaire,10,stdin);
fflush(stdin);
printf("\nVotre rival est donc %s ? (O=Oui, N=Non)\t", adversaire);
scanf("%c", &choix);
fflush(stdin);
if(choix=='O' && choix!='N')
{
printf("\nAh mais oui, c'est ");
}
}while(choix=='N');
printf("%s votre rival!\n\n", adversaire);

do{
printf("\nEt ou habitez-vous?\t\t");
scanf("%s", OHV);
fflush(stdin);
printf("\nVous habitez donc a %s ? (O=Oui, N=Non) ?\t", OHV);
scanf("%c", &choix);
if(choix=='O' && choix!='N')
{
printf("\nVous etes donc ");
}
}while(choix=='N');
printf("%s, de %s !\n\n\n", util, OHV);

system("PAUSE");
return 0;
}
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
11 oct. 2008 à 18:45
le scanf arrete de stocké des qu'il rencontre un espace la solution c'est d'utiliser fgets qui lui stocke les espace
fgets(util,10,stdin);
pour l'autre question au lieu d'utiliser system("PAUSE") tu peux utiliser getchar()
-1
Yuku Messages postés 199 Date d'inscription samedi 22 mars 2008 Statut Membre Dernière intervention 22 mars 2012 4
11 oct. 2008 à 18:47
Le fgets, c'est donc :

fgets(variable, taille, lieu de destination) ?
-1
Yuku Messages postés 199 Date d'inscription samedi 22 mars 2008 Statut Membre Dernière intervention 22 mars 2012 4
11 oct. 2008 à 18:52
Euh oui mais si je mets donc fgets(util, 10, stdin); à la place de scanf("%s", util);, le programme ne s'exécute pas correctement du tout...

Comment je dois initialiser mes variables pour le coup?
-1

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

Posez votre question
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
11 oct. 2008 à 18:58
pour savoir la construction de fgets ICI
comment sa ton prog ne s'execute pas il y a juste a remplacer les scanf ou tu stocke les nom par le fgets...
-1
Yuku Messages postés 199 Date d'inscription samedi 22 mars 2008 Statut Membre Dernière intervention 22 mars 2012 4
11 oct. 2008 à 19:21
J'ai réussi entretemps, j'ai juste mis des fflush entre chaque do{, tout se passe très bien ! ^^

D'autre part j'ai utilisé le strchr pour éviter de prendre en compte le retour à la ligne dans ma chaîne ;)

Merci bien !
-1