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 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.
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 >>
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 );
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.