2016-05-21 13 views
-2

Ich habe eine Datenbankklasse, die ein Array ist, das eine Anzahl von Objekten enthält. Die Funktion wird ein paar Eingaben vom Benutzer nimmt dieWie bekomme ich Benutzereingaben für eine Zeichenfolge und dann ein int?

Zum Beispiel der beiden Strings und ints sind:

std::cout << "Enter first name: "; 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
std::getline(std::cin, first_name); 
std::cout << "Enter last name: "; 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
std::getline(std::cin, last_name); 
std::cout << "Enter age: "; 
std::cin >> age; 

Wenn ich den Code ausführen, nachdem ich den Nachnamen nach der Eingabe der Eingabetaste drücken, es ist einfach startet eine neue Zeile und ich muss eine andere Eingabe eingeben, bevor die Eingabe des Alters angefordert wird.

Ich habe gehört, dass es schlecht war, getline und cin zu mischen, und dass es besser ist, das eine oder das andere zu verwenden. Was kann ich tun, damit dies funktioniert und was wäre eine gute Vorgehensweise?

Edit: Ich fügte die Ignores hinzu, als ich anfänglich nach Lösungen suchte, denn ohne sie würde der Code nicht auf Benutzereingaben warten. Die Ausgabe wäre "Geben Sie den Vornamen ein: Geben Sie den Nachnamen ein:"

Edit2: BEHOBEN. Problem war, dass ich "cin >>" früher in meinem Code für Benutzer verwendet hatte, um eine int-Variable einzugeben, und die erste cin.ignore-Anweisung benötigte, aber nicht die andere. Ich habe diesen Teil des Codes nicht mit einbezogen, weil ich nicht wusste, dass das Auswirkungen auf den Code hatte. Immer noch neu für all das, also danke allen für ihre Hilfe!

+0

Entfernen Sie die 'ignore' Zeilen, weil' std :: getline() 'Sie bereits zur nächsten Zeile bewegt. – Galik

+0

Es ist schlecht, nicht zu wissen, was du tust. Was ist mit den 'ignorieren'? – LogicStuff

+0

Aus Neugier, warum ignorierst du den Input vor der "getline"? Es sieht so aus, als ob Sie den Benutzer zwingen, eine Leerzeile einzugeben, bevor das Programm die Daten eingibt. –

Antwort

1

Gemäß der Dokumentation von std::basic_istream::ignore(), diese Funktion alsUnformatted Eingang Funktion verhält, die es bedeuten wird Block gehen und warten auf Benutzereingaben wenn im Puffer nichts zu überspringen ist.

In Ihrem Fall sind beide Ihre ignore Statements nicht erforderlich, da std::getline() das neue Zeilenzeichen nicht im Puffer belassen wird. Also, was tatsächlich passiert ist:

std::cout << "Enter first name: "; 
/*your first input is skipped by the next ignore line because its going to block until 
input is provided since there is nothing to skip in the buffer*/ 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
/* the next getline waits for input, reads a line from the buffer and also removes the 
new line character from the buffer*/ 
std::getline(std::cin, first_name); 

std::cout << "Enter last name: "; 
/*your second input is skipped by the next ignore line because its going to block until 
input is provided since there is nothing to skip in the buffer*/ 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
/* the next getline waits for input and this is why it seems you need to provide 
another input before it ask you to enter the age*/ 
std::getline(std::cin, last_name); 

Sie müssen die ignore statments entfernen, um diese Arbeit zu machen. Sie können auch lesen When and why do I need to use cin.ignore() in C++

1

ich die ignore Funktion empfehlen Entfernung ruft:

std::string name; 
std::cout << "Enter name: "; 
std::getline(cin, name); 
unsigned int age; 
std::cout << "Enter age: "; 
std::cin >> age; 
+0

Ich hatte anfangs keine Zeilen ignoriert, aber ich bekam immer die Ausgabe: "Geben Sie den Vornamen ein: Geben Sie den Nachnamen ein:". Ich sah mich nach Lösungen um, und genau darauf stieß ich. – ptu27

2

Ihre std::cin::ignore Anrufe helfen Ihnen nicht. Sie werden nur nach einer Eingabe benötigt, die das Ende der Zeile Zeichen (>>) nicht extrahiert.

std::string first_name; 
std::string last_name; 
int age; 

std::cout << "Enter first name: "; 
std::getline(std::cin, first_name); // end of line is removed 

std::cout << "Enter last name: "; 
std::getline(std::cin, last_name); // end of line is removed 

std::cout << "Enter age: "; 
std::cin >> age; // doesn't remove end of line 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // this does 
// input can proceed as normal 

Sie müssen nur den std::cin::ignore Anruf nach std::cin >> age; denn das ist nicht das Ende der Zeile Zeichen nicht entfernen, während die std::getline Anrufe tun.

+0

Wenn ich die Ignorierzeilen entferne, geht die Ausgabe in der Konsole direkt von "Vorname eingeben:" zu "Nachname eingeben:", so dass die Ausgabe lautet: "Vorname eingeben: Nachnamen eingeben:", bevor Benutzereingaben erlaubt werden – ptu27

+0

@ ptu27 Haben Sie einen anderen Code, der eine Eingabe vor dem von Ihnen gezeigten ausführt? –

+0

@bkVnet Ja. Ich habe eine Benutzereingabe für einen int. Das Programm gibt eine Liste von Optionen aus, und der Benutzer gibt ein int ein, um auszuwählen, welche Option über std :: cin – ptu27