Besoin d’aide avec getline ()

Y a-t-il une raison pour laquelle si dans mon programme, je demande à l’utilisateur de saisir des informations et que

int number; ssortingng str; int accountNumber; cout <> number; cout << "Enter name:"; getline(cin, str); cout <> accountNumber; 

Pourquoi, après avoir saisi le premier numéro, il génère “Entrer le nom”, suivi immédiatement de “Entrer le numéro de compte” avant même que je puisse entrer mon “str” ​​pour la ligne getline (cin, str)? Merci!

Le getline(cin, str); lit la nouvelle ligne qui vient après le nombre lu précédemment et retourne immédiatement avec cette “ligne”. Pour éviter cela, vous pouvez ignorer les espaces blancs avec std::ws avant de lire le nom:

 cout << "Enter number:"; cin >> number; cout << "Enter name:"; ws(cin); getline(cin, str); ... 

Notez que ceci ignore également les espaces après le saut de ligne, donc str ne commencera pas par des espaces, même si l'utilisateur les a saisis. Mais dans ce cas, c'est probablement une fonctionnalité, pas un bug ...

Essayer

 cout << "Enter name:"; cin.ignore(); getline(cin, str); 

On dirait que vous voulez une lecture basée sur les lignes. Pour cela, vous voudrez probablement utiliser getline cohérente, puis parsingr chaque ligne si vous devez parsingr un nombre à partir de la ligne lue. Cela rend la lecture d’entrée plus cohérente.

De cette façon, vous n’avez pas à rechercher manuellement la fin de chaque ligne pour garantir que la prochaine opération de lecture commence sur une nouvelle ligne.

Cela simplifie également l’ajout du traitement des erreurs lors de la répétition de demandes d’entrée.

par exemple

 #include  #include  #include  #include  #include  int parse_integer(const std::ssortingng& input) { std::issortingngstream iss(input); int result; if (!(iss >> result)) { // error - throw something? } return result; } int main() { int number; std::ssortingng str; int accountNumber; std::ssortingng inputline; std::cout << "Enter number: "; if (!std::getline(std::cin, inputline)) { // error - throw something? } number = parse_integer(inputline); std::cout << "Enter name:"; if (!std::getline(std::cin, inputline)) { // error - throw something? } str = inputline; std::cout << "Enter account number:"; if (!std::getline(std::cin, inputline)) { // error - throw something? } accountNumber = parse_integer(inputline); return 0; } 
 cin >> number // eat the numeric characters getline(cin, str) // eat the remaining newline 
 cin >> number 

ne saisit que les numéros du tampon, il laisse “entrer” dans le tampon, qui est ensuite immédiatement saisi par la ligne de commande et interprété comme une chaîne vide (ou une chaîne contenant uniquement la nouvelle ligne, je l’oublie).

Je pense que le problème est que cin >> transmet le caractère de nouvelle ligne (\n) . La méthode getline () suppose que le caractère de nouvelle ligne est un espace et le transmet. Quelqu’un a posté une solution que vous pouvez utiliser.

Vous pouvez utiliser un getline(cin, dummy); factice getline(cin, dummy); ou la vraie chose cin.ignore(100,'\n');