Getline() ne marche pas! [Résolu/Fermé]

Messages postés
115
Date d'inscription
vendredi 10 avril 2009
Statut
Membre
Dernière intervention
26 décembre 2014
- - Dernière réponse : SHINTYMAN
Messages postés
115
Date d'inscription
vendredi 10 avril 2009
Statut
Membre
Dernière intervention
26 décembre 2014
- 28 nov. 2012 à 18:46
Voila un moment que je jouais un peu avec le C++ et j'avais enfin décidé de faire un système un peu complexe (j'ai dit un peu!) pour m'amuser et tester mes compétences... Seulement ça n'as pas marché commeil faut!
Avant tout, il faut savoir que mon niveau n'est pas très élevé (par exemple, inutile de me parler de classe ou d'objet); de plus, mon système n'est pas très compliqué. Voila le code:

#include <iostream>
#include <string>
using namespace std;

int main()
{
  string nomJoueur;
  int vie(20);
  int sexe(0); //0 = non renseigné; 1 = male; 2 = female
  cout << "Bonjour et bienvenue dans cette nouvelle aventure. Vous allez entrer... dans le Donjon de Molak'Bar!" << endl << "Avant de commencer, j'ai deux questions a vous poser:" << endl;
  do
  {
      cout << "Quel est votre sexe?" << endl << "Tapez 1 si vous etes un homme;" << endl << "ou 2 si vous etes une femme." << endl;
      cin >> sexe;
      cin.clear();
      if(sexe==1)
      {
          cout << "Ainsi, vous etes un homme..." << endl;
      }
      else if(sexe==2)
      {
          cout << "Donc vous etes une femme..." << endl;
      }
      else
      {
          cout << "Desole, mais " << sexe << " n'est pas la reponsea attendue. Veuillez entrer une donnee correcte." << endl;
      }
  }while(sexe!=1 && sexe!=2);
  cout << "Et maintenant, quel est ton nom?" << endl;
  getline (cin,nomJoueur);
  cin.clear();
  cout << "Ton aventure commence donc, aventurier";
  if(sexe==1)
  {
      cout << " " << nomJoueur << ".";
  }
  else
  {
      cout << "e " << nomJoueur <<".";
  }
  cout << "Tu peux desormais entrer dans le Donjon..." << endl;
  return 0;
}


Mon but est de créer un système de 'livre dont vous êtes le héros' mais sans combat en utilisant une fonction par évènement, qui serait toujours lancée avec le nom, le sexe et le nombre de point de vie du personnage(j'ai pas trouvé mieux comme système avec mes connaissances). Pour ce qui est de la variable :
int vie(20);
elle sera utilisée juste après quand j'appelerai la fonction de la première salle.
Mon problème est que quand je compile le code, tout vas bien mais dès que je lance le programme, il ignore la ligne
getline (cin,nomJoueur);
et le joueur se retrouve sans nom. J'ai fait mes recherches et j'ai cru comprendre que c'est un problème de flux, mais je n'y ai vraiment pas compris grand chose et en cherchant des solutions, je n'ai pas réglé mon problème (cf. http://www.siteduzero.com/tutoriel-3-308268-la-saisie-securisee-en-c.html ). Quelqu'un de compétent aurait-il la bonté de m'aider s'il lui plaît?



Afficher la suite 

4 réponses

Messages postés
9713
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
13 septembre 2019
1098
0
Merci
Salut,
essai le petit code mis en exemlpe à la fin de cette page :
http://en.cppreference.com/w/cpp/string/basic_string/getline
s'il fonctionne, le problème vient de quelque chose dans ton code, je dirais le "cin.clear()" qui fait tout planter.
S'il ne fonctionne pas, il y a un problème plus grave sur ton installation.
Messages postés
115
Date d'inscription
vendredi 10 avril 2009
Statut
Membre
Dernière intervention
26 décembre 2014
124
0
Merci
Bon, bonne nouvelle, le code que tu m'as passé marche. J'ai essayé d'ajouter les std:: devant les commandes, de déplacer la déclaration du string, de donner une valeur au string, et d'inverser les bibliothèques au début, mais rien y fait. J'ai aussi enlevé les cin.clear()... Voici le code maintenant (si tu veux le tester):

#include <string> 
#include <iostream> 

using namespace std; 

int main() 
{ 
  string nomJoueur("default"); 
  int vie(20); 
  int sexe(0); //0 = non renseigné; 1 = male; 2 = female 
  cout << "Bonjour et bienvenue dans cette nouvelle aventure. Vous allez entrer... dans le Donjon de Molak'Bar!" << endl << "Avant de commencer, j'ai deux questions a vous poser:" << endl; 
  do 
  { 
      cout << "Quel est votre sexe?" << endl << "Tapez 1 si vous etes un homme;" << endl << "ou 2 si vous etes une femme." << endl; 
      cin >> sexe; 
      if(sexe==1) 
      { 
          cout << "Ainsi, vous etes un homme..." << endl; 
      } 
      else if(sexe==2) 
      { 
          cout << "Donc vous etes une femme..." << endl; 
      } 
      else 
      { 
          cout << "Desole, mais " << sexe << " n'est pas la reponse attendue. Veuillez entrer une donnee correcte." << endl; 
      } 
  }while(sexe!=1 && sexe!=2); 
  cout << "Et maintenant, quel est ton nom?" << endl; 
  getline (cin,nomJoueur); 
  cout << "Ton aventure commence donc, aventurier"; 
  if(sexe==1) 
  { 
      cout << " " << nomJoueur << "."; 
  } 
  else 
  { 
      cout << "e " << nomJoueur <<"."; 
  } 
  cout << "Tu peux desormais entrer dans le Donjon..." << endl; 
  return 0; 
} 


Donc voila, ça me plonge de plus en plus dans le désespoir de ne jamais voir ce code marcher....
En espérant avoir aidé,
SHINTYMAN
Messages postés
9713
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
13 septembre 2019
1098
0
Merci
J'ai un peu galéré, mais j'ai trouvé. L'erreur est expliqué ici : http://stackoverflow.com/questions/6642865/getline-not-asking-for-input
J'ai réussi à sauter l'erreur en utilisant un cin.ignore (comme la dernière solution du lien) juste avant le getline.
Messages postés
115
Date d'inscription
vendredi 10 avril 2009
Statut
Membre
Dernière intervention
26 décembre 2014
124
0
Merci
Pour citer un personnage d'un jeu que j'ai beaucoup aimé (spyro II):
"CA MARCHE! CA MARCHEU!" Merci beaucoup Char Snipeur pour ton aide! Pour ceux qui n'ont pas compris, voici le code final (on ne sait jamais ;p ):

#include <string>
#include <iostream>

using namespace std;

int main()
{
  string nomJoueur("default");
  int vie(20);
  int sexe(0); //0 = non renseigné; 1 = male; 2 = female
  cout << "Bonjour et bienvenue dans cette nouvelle aventure. Vous allez entrer... dans le Donjon de Molak'Bar!" << endl << "Avant de commencer, j'ai deux questions a vous poser:" << endl;
  do
  {
      cout << "Quel est votre sexe?" << endl << "Tapez 1 si vous etes un homme;" << endl << "ou 2 si vous etes une femme." << endl;
      cin >> sexe;
      if(sexe==1)
      {
          cout << "Ainsi, vous etes un homme..." << endl;
      }
      else if(sexe==2)
      {
          cout << "Donc vous etes une femme..." << endl;
      }
      else
      {
          cout << "Desole, mais " << sexe << " n'est pas la reponse attendue. Veuillez entrer une donnee correcte." << endl;
      }
  }while(sexe!=1 && sexe!=2);
  cout << "Et maintenant, quel est ton nom?" << endl;
  cin.ignore(256, '\n'); //repare l'erreur du getline() qui ne marche pas
  getline (cin,nomJoueur);
  cout << "Ton aventure commence donc, aventurier";
  if(sexe==1)
  {
      cout << " " << nomJoueur << ".\n";
  }
  else
  {
      cout << "e " << nomJoueur <<".\n";
  }
  cout << "Tu peux desormais entrer dans le Donjon..." << endl;
  return 0;
}