Getline() ne marche pas!

Résolu/Fermé
SHINTYMAN Messages postés 113 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 26 décembre 2014 - 27 nov. 2012 à 19:16
SHINTYMAN Messages postés 113 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?



4 réponses

Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
28 nov. 2012 à 08:32
Salut,
essai le petit code mis en exemlpe à la fin de cette page :
https://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.
0
SHINTYMAN Messages postés 113 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 26 décembre 2014 153
Modifié par SHINTYMAN le 28/11/2012 à 11:17
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
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
28 nov. 2012 à 11:55
J'ai un peu galéré, mais j'ai trouvé. L'erreur est expliqué ici : https://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.
0
SHINTYMAN Messages postés 113 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 26 décembre 2014 153
28 nov. 2012 à 18:46
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;
}


0