2017-11-15 7 views
0

Ich habe eine Reihe von Problemen in meinem Programm, die alle mit der Eingabe zu tun haben. Das erste, was in dem Programm, das ich den Benutzer zur Eingabe fragen, ist ihr Name, den ich so mit diesemmit getline(), um Strings in das Programm eingeben verursacht eine Art von Überlauf in den nächsten Eingang

cout << "Please tell me your name." << endl; 
getline(cin, user_name); 
cout << "Hello " << user_name << " and welcome to Fantasy Battle!" << endl; 

wo user_name als String-Variable an anderer Stelle deklariert wird. Dieser Teil scheint keine Probleme zu haben, wie die folgende Meldung auf dem Bildschirm korrekt angezeigt

Die nächste Eingabe vom Benutzer von diesem Code durch

{ 
cout << "Hello, what would you like to do?" << endl; 
cout << "1. Play" << endl << "2. Exit" << endl; 
cout << "Please enter the number corresponding to your choice from the list 
above." << endl; 
for(;;) 
{ 
    if(cin >> menuChoice) 
    { 
     if(cin.get() == '.') 
     { 
      cin.clear(); 
      cin.ignore(10000, '\n'); 
     } 
     if(menuChoice == 1 || menuChoice == 2) 
      break; 
     else 
     { 
      cout << "You did not enter a valid menu option. Please try 
      again." << endl; 
      cin.clear(); 
      cin.ignore(100000, '\n'); 
     } 
    } 
    else 
    { 
     cout << "You did not enter a valid menu option. Please try again." 
     << endl; 
     cin.clear(); 
     cin.ignore(100000, '\n'); 
    } 
} 
if(menuChoice == 2) 
{ 
    return 2; 
} 
else 
{ 
    //setup a fight code further down 
} 

Eines der erste Lauf kommt, wenn ich 2 geben Sie die Ausfahrt wird Programm erfolgreich von Haupt oder wenn Sie 1 eingeben, wird es durch die Kampffunktion laufen. Wenn ich jedoch durch 1 Kampf gehe und das Programm zurückbekomme, das mich auffordert, entweder 1 oder 2 einzugeben, um zu spielen oder zu beenden, kann ich 2 unendliche Male eingeben und es wird das Programm nicht verlassen. Ich bin mir nicht sicher, was das verursacht.

for(;;) 
    { 
     game = menu(); 
     if(game == 2) 
     { 
      break; 
     } 
     else 
     { 
      fight(); 
     } 
    } 
    return 0; 

der Code in der Menü() Funktion meines Programms ist wie folgt und ist, wo der Rest des Eingangs für mein Programm enthalten ist. Ich benutze getline (cin, fighterName), um eine Zeichenfolge vom Benutzer zu erhalten, um als Name für jedes Zeichen zu verwenden, das sie erstellen möchten Das Problem, das ich habe, ist, dass es beginnt, den Namen von Zeichen als leer zu speichern, ohne zu fragen.

cout << "How many fighters should be on Team 1?" << endl; 
//Input Validation 
for(;;) 
{ 
    if(cin.get() == '.') 
    { 
     cin.clear(); 
     cin.ignore(100000, '\n'); 
    } 
    if(cin >> team1Size) 
    { 
     if(team1Size <= 0) 
     { 
      cout << "The team must be a size of at least 1 fighter. Please try again." << endl; 
      cin.clear(); 
      cin.ignore(100000, '\n'); 
     } 
     else 
     { 
      break; 
     } 
    } 
    else 
    { 
     cout << "You did not enter a valid number. Please try again." << endl; 
      cin.clear(); 
      cin.ignore(100000, '\n'); 
    } 
} 

cout << "How many fighters should be on Team 2?" << endl; 
//Input Validation 
for(;;) 
{ 
    if(cin.get() == '.') 
    { 
     cin.clear(); 
     cin.ignore(100000, '\n'); 
    } 
    if(cin >> team2Size) 
    { 
     if(team2Size <= 0) 
     { 
      cout << "The team must be a size of at least 1 fighter. Please try again." << endl; 
      cin.clear(); 
      cin.ignore(100000, '\n'); 
     } 
     else 
     { 
      break; 
     } 
    } 
    else 
    { 
     cout << "You did not enter a valid number. Please try again." << endl; 
      cin.clear(); 
      cin.ignore(100000, '\n'); 
    } 
} 

//Set up team 1 
cout << "Begin setup for team 1:" << endl << endl; 
for(int i = 0; i < team1Size; i++) 
{ 
    cout << "Which character type should fighter " << i+1 << " be?" << endl; 
    cout << "1. Barbarian" << endl; 
    cout << "2. BlueMen" << endl; 
    cout << "3. Vampire" << endl; 
    cout << "4. Medusa" << endl;  
    cout << "5. Harry Potter" << endl; 
    cout << "Please enter the number corresponding to your choice from the list above." << endl; 
    for(;;) 
    { 
     if(cin.get() == '.') 
     { 
      cin.clear(); 
      cin.ignore(100000, '\n'); 
     } 
     if(cin >> fighterType) 
     { 
      if(fighterType < 1 || fighterType > 5) 
      { 
       cout << "You did not enter a valid choice. Please try again." << endl; 
       cin.clear(); 
       cin.ignore(100000, '\n'); 
      } 
      else 
       break; 
     } 
     else 
     { 
      cout << "You did not enter a valid choice. Please try again." << endl; 
      cin.clear(); 
      cin.ignore(100000, '\n'); 
     } 
    } 
    //Now that we have the desired type of the fighter we must add a fighter of the correct type to the linked list 
    //representing team 1. We will do so by calling the add function of the linked list 
    cout << "Please enter the name of this fighter." << endl; 
    getline(cin, fighterName); 
    if(fighterType == 1) 
    { 
     team1.addBack("Barbarian", fighterName); 
    } 
    else if(fighterType == 2) 
    { 
     team1.addBack("BlueMen", fighterName); 
    } 
    else if(fighterType == 3) 
    { 
     team1.addBack("Vampire", fighterName); 
    } 
    else if(fighterType == 4) 
    { 
     team1.addBack("Medusa", fighterName); 
    } 
    else 
    { 
     team1.addBack("HarryPotter", fighterName); 
    } 

} 

cout << "Team 1 has been created!" << endl << endl; 

//Set up team 2 
cout << "Begin setup for team 2:" << endl << endl; 
for(int i = 0; i < team2Size; i++) 
{ 
    cout << "Which character type should fighter " << i+1 << " be?" << endl; 
    cout << "1. Barbarian" << endl; 
    cout << "2. BlueMen" << endl; 
    cout << "3. Vampire" << endl; 
    cout << "4. Medusa" << endl;  
    cout << "5. Harry Potter" << endl; 
    cout << "Please enter the number corresponding to your choice from the list above." << endl; 
    for(;;) 
    { 
     if(cin.get() == '.') 
     { 
      cin.clear(); 
      cin.ignore(100000, '\n'); 
     } 
     if(cin >> fighterType) 
     { 
      if(fighterType < 1 || fighterType > 5) 
      { 
       cout << "You did not enter a valid choice. Please try again." << endl; 
       cin.clear(); 
       cin.ignore(100000, '\n'); 
      } 
      else 
       break; 
     } 
     else 
     { 
      cout << "You did not enter a valid choice. Please try again." << endl; 
      cin.clear(); 
      cin.ignore(100000, '\n'); 
     } 
    } 
    //Now that we have the desired type of the fighter we must add a fighter of the correct type to the linked list 
    //representing team 2. We will do so by calling the add function of the linked list 
    cout << "Please enter the name of this fighter." << endl; 
    getline(cin, fighterName); 
    if(fighterType == 1) 
    { 
     team2.addBack("Barbarian", fighterName); 
    } 
    else if(fighterType == 2) 
    { 
     team2.addBack("BlueMen", fighterName); 
    } 
    else if(fighterType == 3) 
    { 
     team2.addBack("Vampire", fighterName); 
    } 
    else if(fighterType == 4) 
    { 
     team2.addBack("Medusa", fighterName); 
    } 
    else 
    { 
     team2.addBack("HarryPotter", fighterName); 
    } 
} 


cout << "Team 2 has been created!" << endl << endl; 

cout << "Let the fight begin!" << endl << endl; 

return 0; 

}

Das letzte Stück von Eingang aus meinem Code ist die folgende, die einfach den Benutzer auffordert, ein Zeichens entweder y oder n eingeben und führt dann eine Funktion, wenn Y eingegeben wird.

cout << "Would you like to see the contents of the loserPile?" << endl; 
    cout << "Please enter y for yes or n for no" << endl; 
    for(;;) 
    { 
     if(cin >> displayLosers) 
     { 
      if(displayLosers != 'y' && displayLosers != 'n') 
      { 
       cout << "You did not enter either y or n. Please try again." << endl; 
       cin.clear(); 
       cin.ignore(100000, '\n'); 
      } 
      else 
       break; 
     } 
     else 
     { 
      cout << "You did not enter either y or n. Please try again." << endl; 
      cin.clear(); 
      cin.ignore(100000, '\n'); 
     } 
    } 
    if(displayLosers == 'y') 
    { 
     losers.displayPile(); 
    } 

Wenn jemand darauf hinweisen könnte, wo ich die Fehler mache Benutzereingaben bei der Beschaffung Ich würde es zu schätzen weiß, wie ich aus den Dingen am Laufen zu versuchen, die ich kenne.

+0

Viel zu viel Code. Bitte geben Sie eine [MCVE] an. Etwas wie 5 Zeilen Code sollte ausreichen, um ein Problem mit 'getline' zu demonstrieren. – user463035818

+0

Mögliches Duplikat von [Warum überspringt std :: getline() Eingaben nach einer formatierten Extraktion?] (Https://stackoverflow.com/questions/21567291/why-does-stdgetline-skip-input-nach-einem-formatierten-extraktion) – user0042

+0

Was sind die type (s) Ihrer String-Variablen? Sind das Zeichenarrays oder 'std :: string' oder ein anderer Datentyp? –

Antwort

0

Sie sind eine Menge Probleme schaffen, indem if(cin.get() == '.')

Der >> Operator Zugabe wird die Eingabezeichenfolge "1."-1 konvertieren, und wenn Sie ignore(...,'\n') die . rufen und alle anderen Zeichen vor \n werden ignoriert. Test für if(cin >> number){...} ist auch nicht notwendig. Sie können den Wert initialisieren -1 einen Fehler anzuzeigen:

int menuChoice; 
for(;;) 
{ 
    menuChoice = -1; 
    cin >> menuChoice; 
    cout << menuChoice; 
    cin.clear(); 
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    if(menuChoice == 1 || menuChoice == 2) 
    { 
     cout << menuChoice << "\n"; 
     break; 
    } 
    cout << "You did not enter a valid menu option. Please try again." << endl; 
} 

Sie sicher, dass Sie den richtigen Eingang verwenden. Für die Option Ja oder Nein sollte die Eingabe char sein:

cout << "enter y or n\n"; 
for(;;) 
{ 
    char val; 
    cin >> val; 
    if(val != 'y' && val != 'n') 
    { 
     cout << "You did not enter either y or n. Please try again." << endl; 
     cin.clear(); 
     cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    } 
    else 
     break; 
} 
+0

Die meisten meiner Probleme waren mit cin, get() wie du gerade gesagt hast, wo ich es im Validierungscode hatte. –

Verwandte Themen