Warum wird nach Eingabe der ersten Zahl “Name eingeben” ausgegeben, gefolgt von “Kontonummer eingeben”, bevor ich überhaupt mein “str” für die Zeile getline(cin, str) eingeben kann? Danke!
etw
Die getline(cin, str); liest den Zeilenumbruch, der nach der zuvor gelesenen Zahl kommt, und kehrt sofort mit dieser “Zeile” zurück. Um dies zu vermeiden, können Sie Leerzeichen mit überspringen std::ws bevor man den Namen liest:
Beachten Sie, dass dadurch auch führende Leerzeichen nach dem Zeilenumbruch übersprungen werden, so str beginnt nicht mit Leerzeichen, selbst wenn der Benutzer sie eingegeben hat. Aber in diesem Fall ist das wahrscheinlich ein Feature, kein Bug …
Beachten Sie, dass diese Methode es dem Benutzer nicht erlaubt, eine leere Zeile einzugeben.
Es sieht so aus, als ob Sie zeilenbasiertes Lesen wünschen. Dafür möchten Sie wahrscheinlich verwenden getline konsistent und parsen Sie dann jede Zeile, wenn Sie eine Zahl aus der Lesezeile parsen müssen. Es macht die Eingangslesung 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 vereinfacht auch das Hinzufügen einer Fehlerbehandlung für wiederholte Eingabeanforderungen.
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;
}
Ape-inago
cin >> number
holt nur die Zahlen aus dem Puffer, es lässt das “Enter” im Puffer, das dann sofort von getline aufgegriffen und als leerer String (oder String mit nur der neuen Zeile, ich vergesse) interpretiert wird.
cin >> number // eat the numeric characters
getline(cin, str) // eat the remaining newline
Secko
Ich denke, das Problem ist das cin >> übergibt das Newline-Zeichen (\n). getline() geht davon aus, dass das Zeilenumbruchzeichen ein Leerzeichen ist und gibt es weiter. Jemand hat eine Lösung gepostet, die Sie verwenden können.
Sie können einen Dummy verwenden getline(cin, dummy); oder das Echte cin.ignore(100,'\n');
Toby Speight
Nicht verwenden getline(): Es ist eine schlechte Sache für die Speicherzuweisung. Verwenden fgets(). Sehen fgets Hinweis.
9873800cookie-checkBrauche Hilfe bei getline() [duplicate]yes