1
votes

Obtenir une sortie nulle avec >> et getline même si j'utilise des espaces de chaîne

J'essaie d'ajouter des variables par les utilisateurs saisis en utilisant >> ou getline, mais cela donne des valeurs nulles avec les deux. Comme nous le savons, getline n'ignore pas les premiers caractères d'espacement, c'est pourquoi i ' m en utilisant des espaces de chaîne comme employeeName = ""; string désignation = ""; . Quelqu'un peut-il m'aider à obtenir une sortie correcte

class Employee{
  public:
  int employeeId,salary;
  string employeeName=" ";
  string designation=" ";
  void getEmployee(){
    cin>>employeeId;
    getline(cin,employeeName);
    getline(cin,designation);
    cin>>salary;
  }
  void ShowEmployee(){
    cout<<"Employee Id="<<employeeId<<"\n";
    cout<<"Employee Name="<<employeeName<<"\n";
    cout<<"Designation="<<designation<<"\n";
    cout<<"Salary="<<salary<<"\n";
  }
};
int main() {
  Employee ob;
  ob.getEmployee();
  ob.ShowEmployee();
}

entrez la description de l'image ici quelqu'un peut-il m'aider :)


5 commentaires

Voter pour fermer comme faute de frappe. Vous avez oublié d'appeler getEmployee () et vous n'avez pas mis toutes les variables en sortie dans vos instructions cout << (sauf pour salaire ).


Et en prévision du problème suivant, veuillez lire c ++ getline () n'attend pas l'entrée de la console lorsqu'il est appelé plusieurs fois


Désolé j'ai oublié ces choses, veuillez vérifier le code modifié et aidez-moi à obtenir une sortie correcte.


Cela vous aiderait si vous pouviez également publier votre texte d'entrée.


oui j'avais téléchargé, veuillez le vérifier


3 Réponses :


1
votes

Mais vous n'appelez pas getEmployee dans votre exemple. Avez-vous oublié?

Vous pouvez également essayer un constructeur en passant le std :: istream et à lui comme

Employee(std::istream& in) {
  in >> this->employeeId;
  in >> this->salary;
  ....
}


3 commentaires

Désolé, j'ai oublié d'appeler getEmployee ici, j'ai également essayé cela en utilisant le constructeur `` this '' mais il donne les mêmes valeurs nulles .Veuillez vérifier le code modifié et aidez-moi.


Pas de problème. Pour une approche très rapide et très sale, vous pouvez utiliser un cin.ignore (); avant votre premier std :: geline (...) qui permettra de saisir des lignes terminées par un NL.


Comme @Kaldrr l'a souligné précédemment, il serait préférable de ne pas mélanger l'opérateur >> et getlline () Il semble que vous puissiez lire toutes les informations dans std :: string en utilisant getline et convertir celles qui doivent être des nombres à la place. Par exemple, en utilisant cette approche std: stringstream



1
votes

Vous n'appelez jamais les fonctions membres de getEmployee . Comme votre objet Employee est créé sur la pile, et que employeeId et salaire ne sont pas initialisés, ils contiennent des valeurs de déchets à l'intérieur.

Dans la fonction membre ShowEmployee , vous ne sortez que la valeur de la variable salaire , donc je suppose que ce n'est pas exactement le code que vous compilez et tester par vous-même.

En ce qui concerne votre raisonnement pour lequel vous utilisez getline , je ne comprends pas du tout, la chaîne qui est passée en tant que deuxième argument sera écrasée, donc tout ce qu'il y avait avant l'appel est perdu. Mais si vous souhaitez mélanger les appels operator>> et getline sur le même flux comme vous le faites, vous devez utiliser ignore , car operator>> n'extrayera pas '\ n' du flux, qui sera lu par getline .


0 commentaires

1
votes
getline(cin,employeeName);
getline(cin,designation);
In the code above you are overwriting the string,If you want to mix users input of multiple datatypes try to use cin.ignore; before your first std::getline(...).

0 commentaires