Brauche Hilfe bei getline() [duplicate]

Lesezeit: 3 Minuten

Brauche Hilfe bei getline duplicate
Jon

Gibt es einen Grund, warum ich in meinem Programm den Benutzer um Eingabe bitte, und ich tue:

int number;
string str;
int accountNumber;

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

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!

1646905211 144 Brauche Hilfe bei getline duplicate
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:

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

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.

    – zwischenjay

    27. September 2012 um 13:44 Uhr

Versuchen

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

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;
}

Brauche Hilfe bei getline duplicate
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

Brauche Hilfe bei getline duplicate
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');

1646905214 380 Brauche Hilfe bei getline duplicate
Toby Speight

Nicht verwenden getline(): Es ist eine schlechte Sache für die Speicherzuweisung. Verwenden fgets(). Sehen fgets Hinweis.

987380cookie-checkBrauche Hilfe bei getline() [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy