2009-11-16 8 views
17

Gibt es einen Grund, warum, wenn in meinem Programm, das ich den Benutzer zur Eingabe bin zu fragen, und ich tue:Benötigen mit getline helfen()

int number; 
string str; 
int accountNumber; 

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

Warum nach der ersten Nummer eingegeben hat, gibt es „eingeben“ , direkt gefolgt von "Account-Nummer eingeben", bevor ich überhaupt meinen "str" ​​für die getline (cin, str) Zeile eingeben kann? Vielen Dank!

+0

möglich Duplikat [Was bin ich nicht zu verstehen, über getline + Strings?] (Http://stackoverflow.com/questions/8248239/what-am-i-not-understanding-about-getlinestrings) –

+0

Mögliche Duplikat von [Warum überspringt std :: getline() Eingaben nach einer formatierten Extraktion?] (http://stackoverflow.com/questions/21567291/why-does-stdgetline-skip-input-after-a-formatted-extraction) –

Antwort

3
cin >> number // eat the numeric characters 
getline(cin, str) // eat the remaining newline 
2
cin >> number 

greift nur die Zahlen aus dem Puffer, es die „Enter“ in den Puffer verlässt, die dann unmittelbar durch den getline packte und als leere Zeichenfolge (oder String interpretiert nur mit dem neuen Linie, ich vergesse). Versuchen

+1

cin >> Nummer, nicht? – pmr

+0

Ja, er tippte falsch das ist alles. – Secko

+0

@Secko Ja, und genau das wollte ich kommunizieren. Ich entschuldige mich, wenn ich unhöflich zu sein schien. – pmr

12

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

Ich denke, das Problem ist, dass cin >> Pass auf dem Newline-Zeichen (\n). Die Funktion getline() nimmt an, dass das Zeilenumbruchzeichen Leerzeichen ist und gibt es weiter. Jemand hat eine Lösung gepostet, die Sie verwenden können.

Sie können eine Dummy-getline(cin, dummy); oder das Eigentliche verwenden cin.ignore(100,'\n');

16

Die getline(cin, str); die Newline liest, der kommt, nachdem die Zahl vorher gelesen und sofort wieder mit dieser „Linie“. Um dies zu vermeiden Sie Leerzeichen mit std::ws vor dem Lesen des Namens überspringen können:

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

Beachten Sie, dass dies auch führende Leerzeichen nach dem Newline überspringt, wird so str nicht mit Leerzeichen beginnen, auch wenn der Benutzer hat sie einzugeben. Aber in diesem Fall ist das wahrscheinlich ein Feature, kein Bug ...

+0

Beachten Sie, dass diese Methode dem Benutzer nicht erlaubt, eine leere Zeile einzugeben. – interjay

4

Es sieht so aus, als ob Sie eine lineare Lesung wünschen. Dazu möchten Sie wahrscheinlich getline konsistent verwenden und dann jede Zeile analysieren, wenn Sie eine Zahl von der gelesenen Zeile analysieren müssen. Es macht das Lesen der Eingabe konsistenter.

Auf diese Weise müssen Sie nicht manuell nach dem Ende jeder Zeile suchen, um sicherzustellen, dass der nächste Lesevorgang in einer neuen Zeile beginnt.

Es macht auch das Hinzufügen von Fehlerbehandlung für wiederholte Eingabeanforderungen einfacher.

z.B.

#include <string> 
#include <iostream> 
#include <istream> 
#include <ostream> 
#include <sstream> 

int parse_integer(const std::string& input) 
{ 
    std::istringstream iss(input); 
    int result; 
    if (!(iss >> result)) 
    { 
     // error - throw something? 
    } 
    return result; 
} 

int main() 
{ 
    int number; 
    std::string str; 
    int accountNumber; 

    std::string 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; 
}