2012-05-11 6 views
36

früher habe ich eine Frage über cin überspringen Eingabe, und ich habe Ergebnisse zu spülen, und istringstream verwenden, aber jetzt habe ich versucht jede mögliche Lösung, aber keiner von ihnen funktioniert.cin und getline überspringen Eingabe

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 bin immer noch die gleiche Sache immer, Input-Skipping, und wenn es Eingang nimmt, dauert es sie und speichert in Namen leer nichts, und in Adresse es Nimmt, was ich in Namen geschrieben habe, aber vom 2. Brief bis zum Ende

Was ist falsch an meinem Code?

habe ich versucht, die cin.ignore(), cin.get() und cin.clear() alle von ihnen zusammen und allein, keiner von ihnen

EDIT gearbeitet:

main-Methode in main.cpp ruft 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 1 erneut, um ein neues Kundenobjekt zu erstellen, das jetzt zur MainFunctions.cpp geht, die die Funktion createNewCustomer() aufruft, die die erste ist.

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

Bitte zu fangen ein komplettes Beispiel Wenn das schwierig ist, zeigen Sie bitte zumindest die Funktion an, von der diese Funktion aufgerufen wird. –

+0

ok, ich werde die Frage bearbeiten, um etwas zu enthalten, das irgendwie einer Stapelspur ähnelt und ein Screenshot des Beispiels –

+0

Sie sagten, Sie versuchten cin.ignore. Gib den Code, es hätte funktionieren sollen. –

Antwort

73

Wenn Sie getline nach cin >> something verwenden sind, müssen Sie das Newline aus dem Puffer zwischendurch spülen.

Mein persönlicher Favorit dafür, wenn keine Zeichen hinter der Newline benötigt werden, ist cin.sync(). Es ist jedoch eine Implementierung definiert, daher funktioniert es möglicherweise nicht so wie für mich. Verwenden Sie für etwas Solides cin.ignore(). Oder die Verwendung von std::ws machen führende Leerzeichen zu entfernen, falls erwü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 
+3

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

+0

@BenjaminLindley, es hat immer perfekt für mich gearbeitet. Können Sie eine Dokumentation finden, in der die ungelesenen Zeichen nicht gelöscht werden sollen? – chris

+0

Ich habe nicht cin vor der getline in der Funktion 'createNewCustomer()' verwendet, aber es wird in den Funktionen 'createNewCustomer()' wie in 'mainMenu()' und 'customerMenu()' –

2

Hier die '\n' von cin links, wird Probleme zu schaffen.

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

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

Diese \n wird in createNewCustomer() von nächsten getline verbraucht wird. 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.

+0

Um 'getline' zu ​​verwenden, müssten Sie' choice' in string ändern, dann könnte es nicht so im 'switch' verwendet werden: Sie könnten' choice [0] 'verwenden, aber das würde Fehler verbergen (zB ' 11 'würde wie 1 behandelt, aber das ist auch der Fall für den akzeptierten Fehler, der den Rest der Zeile ignoriert. –

10

Die Struktur des Menüs Code ist die Frage:

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. 
2

ich dieses Problem konfrontiert, und löste dieses Problem getchar mit() zeigen die ('\ n') new char