cin und getline Eingabe überspringen [duplicate]

Lesezeit: 5 Minuten

cin und getline Eingabe uberspringen duplicate
hakuna matata

zuvor habe ich eine Frage zu gepostet cin Eingabe überspringen, und ich habe Ergebnisse zum Spülen und Verwenden istringstreamaber jetzt habe ich alle möglichen Lösungen ausprobiert, aber keine davon funktioniert.

hier ist mein Code:

void createNewCustomer () {
    string name, address;

    cout << "Creating a new customer..." << endl;
    cout << "Enter the customer's name: "; getline(cin, name);
    cout << "Enter the customer's address: "; getline(cin, address);

    Customer c(name, address, 0);
    CustomerDB::addCustomer(c);

    cout << endl;
}

aber ich bekomme immer noch das Gleiche, überspringe die Eingabe, und wenn es eine Eingabe braucht, nimmt es sie und speichert im Namen leer nichts, und in der Adresse nimmt es das, was ich im Namen geschrieben habe, aber vom 2. Buchstaben bis zum Ende

Was ist falsch an meinem Code?

Ich versuchte die cin.ignore(), cin.get()und cin.clear() alle zusammen und allein, keiner von ihnen arbeitete

BEARBEITEN:

main-Methode in main.cpp aufruft mainMenu() nur

void mainMenu () {
    char choice;

    do {
        system("cls");
        mainMenuDisplay();
        cin >> choice;
        system("cls");

        switch (choice) {
            case '1':
                customerMenu();
                break;

            case '2':
                dvdMenu();
                break;

            case '3':
                receiptMenu();
                break;

            case '4':
                outro();
                break;

            default:
                cout << '\a';
        }

        cin.ignore();
        cin.get();
    } while (choice != '4');
}

Ich wähle 1 für das Kundenbeispiel, das ist customerMenu()

void customerMenu () {
    char choice;

    do {
        system("cls");
        manageCustomerMenu();
        cin >> choice;
        system("cls");

        switch (choice) {
            case '1':
                createNewCustomer();
                break;

            case '2':
                deleteCustomer();
                break;

            case '3':
                updateCustomerStatus();
                break;

            case '4':
                viewCustomersList();
                break;

            case '5':
                mainMenu();
                break;

            default:
                cout << '\a';
        }

        cin.ignore();
        cin.get();
    } while (choice != '5');
}

Ich wähle erneut 1, um ein neues Kundenobjekt zu erstellen, das nun zu MainFunctions.cpp geht, das die Funktion aufruft createNewCustomer() das ist das erste.

void createNewCustomer () {
    string name, address;

    cout << "Creating a new customer..." << endl;
    cout << "Enter the customer's name: "; cin.getline(name,256);
    cout << "Enter the customer's address: "; cin.getline(address,256);

    Customer c(name, address, 0);
    CustomerDB::addCustomer(c);

    cout << endl;
}

  • Bitte zeigen Sie ein vollständig kompilierbares Beispiel. Wenn das schwierig ist, zeigen Sie bitte zumindest die Funktion, von der diese Funktion aufgerufen wird.

    – Benjamin Lindley

    11. Mai 2012 um 14:48 Uhr


  • ok, ich werde die Frage so bearbeiten, dass sie etwas enthält, das irgendwie einem Stack-Trace und einem Screenshot des Beispiels ähnelt

    – hakuna matata

    11. Mai 2012 um 14:52 Uhr

  • Sie sagten, Sie versuchten cin.ignore. Gib mal den Code ein, es sollte funktionieren.

    – J-16 SDiZ

    11. Mai 2012 um 15:00 Uhr

cin und getline Eingabe uberspringen duplicate
Chris

Wenn Sie verwenden getline nach dem cin >> somethingmüssen Sie den Zeilenumbruch zwischendurch aus dem Puffer spülen.

Mein persönlicher Favorit dafür, wenn keine Zeichen nach dem Zeilenumbruch benötigt werden, ist cin.sync(). Es ist jedoch implementierungsdefiniert, daher funktioniert es möglicherweise nicht so wie bei mir. Verwenden Sie für etwas Solides cin.ignore(). Oder nutzen std::ws um führende Leerzeichen zu entfernen, falls gewünscht:

int a;

cin >> a;
cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n'); 
//discard characters until newline is found

//my method: cin.sync(); //discard unread characters

string s;
getline (cin, s); //newline is gone, so this executes

//other method: getline(cin >> ws, s); //remove all leading whitespace

  • sync() ist dafür nicht definiert, obwohl es in einigen Fällen funktionieren kann. Es funktioniert nicht für mich.

    – Benjamin Lindley

    11. Mai 2012 um 14:59 Uhr


  • @ aizen92, jederzeit du cin >> something, wird ein Zeilenumbruch im Puffer hinterlassen. Der Puffer bleibt beim Funktionswechsel erhalten, solange Sie noch verwenden cin. Wenn die nächste Operation mit zu tun hat cin ist getlineliest es diesen übrig gebliebenen Zeilenumbruch und scheint die Eingabe zu überspringen.

    – Chris

    11. Mai 2012 um 15:02 Uhr


  • Bitte schön. n3242, der letzte C++11-Entwurf, §27.9.1.5/19 — “int sync() Effekte: Wenn ein Put-Bereich existiert, ruft filebuf::overflow auf, um die Zeichen in die Datei zu schreiben. Wenn ein Get-Bereich existiert, ist der Effekt implementierungsdefiniert.”

    – Benjamin Lindley

    11. Mai 2012 um 15:12 Uhr

  • Was passiert, wenn der Benutzer mehr als 80 Zeichen in einer Zeile eingibt? Bevorzugen: std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

    – Robᵩ

    11. Mai 2012 um 17:28 Uhr


  • Danke, hatte schon länger damit zu kämpfen.

    – Saheb

    5. Januar 2015 um 6:18 Uhr

1647202807 844 cin und getline Eingabe uberspringen duplicate
jrok

Die Struktur Ihres Menücodes ist das Problem:

cin >> choice;   // new line character is left in the stream

 switch ( ... ) {
     // We enter the handlers, '\n' still in the stream
 }

cin.ignore();   // Put this right after cin >> choice, before you go on
                // getting input with getline.

  • Das hat bei mir ganz gut funktioniert.

    – Patrick Mutwiri

    14. März 2020 um 23:09 Uhr

Hier die '\n' links von cin, verursacht Probleme.

do {
    system("cls");
    manageCustomerMenu();
    cin >> choice;               #This cin is leaving a trailing \n
    system("cls");

    switch (choice) {
        case '1':
            createNewCustomer();
            break;

Dies \n wird von next getline in verbraucht createNewCustomer(). Sie sollten stattdessen getline verwenden –

do {
    system("cls");
    manageCustomerMenu();
    getline(cin, choice)               
    system("cls");

    switch (choice) {
        case '1':
            createNewCustomer();
            break;

Ich denke, das würde das Problem lösen.

  • Benutzen getline du müsstest dich umziehen choice zu besaiten, dann könnte es nicht so in der verwendet werden switch: Du könntest benutzen choice[0] aber das würde Fehler verbergen (z. B. würde ’11’ als 1 behandelt, aber das gilt auch für den akzeptierten Fehler, der den Rest der Zeile ignoriert.

    – Toni Delroy

    15. September 2015 um 2:50 Uhr

Ich bin auf dieses Problem gestoßen und habe dieses Problem mit getchar() gelöst, um das neue Zeichen (‘\n’) abzufangen

998910cookie-checkcin und getline Eingabe überspringen [duplicate]

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

Privacy policy