web-dev-qa-db-fra.com

getline ne fonctionne pas correctement? Quelles pourraient être les raisons?

Duplicata possible:
getline ne demande pas d'entrée?

Il se passe quelque chose d'unique dans mon programme. Voici un ensemble de commandes:

 cout << "Enter the full name of student: ";  // cin name
 getline( cin , fullName );

 cout << "\nAge: ";  // cin age
 int age;
 cin >> age ;

cout << "\nFather's Name: ";  // cin father name
getline( cin , fatherName );

cout << "\nPermanent Address: ";  // cin permanent address
getline( cin , permanentAddress );

Lorsque j'essaie d'exécuter cet extrait avec tout le code, le programme de sortie fonctionne comme:

enter image description here

production:

Enter the full name of student:
Age: 20

Father's Name:
Permanent Address: xyz

Si vous remarquez, le programme ne m'a pas demandé le nom complet et a continué directement pour me demander l'âge, puis il ignore également le nom du père et demande l'adresse permanente. Quelle pourrait être la raison de cela?

Il m'est difficile de publier l'intégralité du code car il est trop volumineux.

21
Suhail Gupta

Puisque vous n'avez posté aucun code. Je vais faire une supposition.

Un problème courant lors de l'utilisation de getline avec cin est que getline n'ignore pas les premiers espaces.

Si getline est utilisé après cin >>, La getline() voit ce caractère de nouvelle ligne comme un premier espace, et il arrête juste de lire plus loin.

Comment le résoudre?

Appelez cin.ignore() avant d'appeler getline()

Ou

faire un appel factice getline() pour consommer le caractère de fin de ligne à partir du cin >>

58
Alok Save

Le problème est que vous mélangez getline avec cin >> contribution.

Lorsque vous faites cin >> age;, qui obtient l'âge du flux d'entrée, mais laisse des espaces sur le flux. Plus précisément, il laissera une nouvelle ligne sur le flux d'entrée, qui sera ensuite lue par le prochain appel getline comme une ligne vide.

La solution consiste à utiliser uniquement getline pour obtenir une entrée, puis à analyser la ligne pour obtenir les informations dont vous avez besoin.

Ou pour corriger votre code, vous pouvez effectuer les opérations suivantes, par exemple. (vous devrez toujours ajouter vous-même le code de vérification des erreurs):

cout << "Enter the full name of student: ";  // cin name
getline( cin , fullName );

cout << "\nAge: ";  // cin age
int age;
{
    std::string line;
    getline(cin, line);
    std::istringstream ss(line);
    ss >> age;
}

cout << "\nFather's Name: ";  // cin father name
getline( cin , fatherName );

cout << "\nPermanent Address: ";  // cin permanent address
getline( cin , permanentAddress );
3
Sander De Dycker

après la ligne cin >> age ;, il y a toujours le caractère de nouvelle ligne \n (parce que vous avez appuyé sur Entrée pour saisir la valeur) dans le tampon d'entrée, pour corriger cela, vous ajoutez une ligne avec cin.ignore(); après avoir lu l'int.

1
lccarrasco