cin.getline Probleme
-
Ich bin noch nicht sehr weit in c++.
Doch schon jetzt kriege ich tausende Probleme.Ich hab da ein kleines Spiel gebastelt, die eine Cheateingabe erlauben soll.
#include <iostream> using namespace std; #include <conio.h> #include <windows.h> #include <stdlib.h> #include <string.h> //Unwichtiger Teil... char Eingabe; char pMode; bool turn_for_bot; bool ZahlenZiehenIstVorbei; int i, LEBEN_PLAYER, LEBEN_BOT, LEBEN_PLAYER_2, RUNDENZAHL; int Input=0, INPUT_BOT=0, timer_ss=0; int Leben_Cheat=0; const int MAX=7; void Start(); //Unwichtiger Teil... void Trennlinie() { cout << "=================================================" <<endl; } void seekForCheats() { int check, e; bool gueltig = true; char Cheats[MAX]; cout << "\n****CHEATMENUE****\n"; cin.getline(Cheats, MAX); //Hier sollte eigentlich die Eingabe erfolgen. do { for (e=0;e<7;e++) { switch (e) { case 0: if (Cheats[e] != 'D') { gueltig = false; } break; case 1: if (Cheats[e] != 'm') { gueltig =false; } break; case 2: if (Cheats[e] != 'a') { gueltig =false; } break; case 3: if (Cheats[e] != 'n') { gueltig =false; } break; case 4: if (Cheats[e] != '4') { gueltig =false; } break; case 5: if (Cheats[e] != 't') { gueltig =false; } break; case 6: if (Cheats[e] != 'w') { gueltig =false; } else { cout << "\n!!Cheat initialisiert!!\nEingabe des Lebens: "; cin >> Leben_Cheat; if (Leben_Cheat < 3 || Leben_Cheat > 50) { cout << "\n!!!Falsche Eingabe!!!, m\x94gl. Gr\x81nde :\n"; cout << "1. Die Eingabe war keine Zahl.\n"; cout << "2. Die Eingabe war kleiner als 3 (3 ist Standard Leben)\n"; cout << "3. Die Eingabe war gr\x94sser als 50 \n(Es w\x84re unfair....50 gegen 3 Leben reicht doch : D)\n"; } else { Leben_Cheat = Leben_Cheat - 3; } } break; } } }while (gueltig); Start(); } void Menue() { cout << "\n\t\t***Hauptmenue***\n"; cout << "(S)pielstart\n"; cout << "(C)heatmenue\n"; cout << "Spiel beenden = q "; char wahlpunkt; cin >> wahlpunkt; switch (wahlpunkt) { case 's': cout << "\nWeiterleitung ins Spiel...\n"; Start(); break; case 'S': cout << "\nWeiterleitung ins Spiel...\n"; Start(); break; case 'c': cout << "\nWeiterleitung ins Cheatmenue\n"; seekForCheats(); break; case 'C': cout << "\nWeiterleitung ins Cheatmenue\n"; seekForCheats(); break; case 'q': system("exit"); break; case 'Q': system("exit"); break; default: cout << "\n***Falsche Eingabe***\n"; Menue(); } } void Start () { cout << "\n\nSelect Play Mode:\n"; cout << "Player vs. Player (PvP) = P"; cout << "\nPlayer vs. Bot (PvE) = E\nDas Leben beträgt jedes mal 3\n\n"; cin >> pMode; //Prüfe ob 'p' anstatt von 'P' oder 'e' an Stelle von 'E' eingegeben wurden ist. if (pMode == 'p') { pMode = 'P'; } else if (pMode == 'e') { pMode = 'E'; } //Führt zum gewähltem Modus if (pMode == 'P') { pMode = 0; Trennlinie(); cout << "Tut mir leid, aber diese Funktion ist noch nicht w\x84hlbar\n"; Trennlinie(); Start(); //Hier wird man eigentlich zur Spiele-Funktion geleitet, doch um nicht zu viel Text zu posten wiederhole ich die Funktion. } else if (pMode == 'E') { pMode = 0; Trennlinie(); cout << "\nPvE ausgew\x84hlt...starte\n"; Trennlinie(); Start();//Hier wird man eigentlich zur Spiele-Funktion geleitet, doch um nicht zu viel Text zu posten wiederhole ich die Funktion. } else { pMode = 0; cout << "!!!FALSCHE EINGABE!!!"; Start(); } } int main(int argc, char* argv[]) { cout << "***Stein Schere Papier!***\t\t\t\tVer: 0.4.9" <<endl; cout << "***Hier geht es jetzt um das wohl bekannte Spiel\n***\x22Schere Stein oder Papier\x22" <<endl; cout << "***Du wirst gegen einen Freund oder Bot spielen k\x94nnen."; cout << "\n***Weiter mit beliebiger Taste***"; Menue(); }Dabei klappt das ganze nicht.
Wenn man beim Hauptmenue angekommen ist udn "C" oder "c" eintippt gelangt man zur Funktion die den Cheat überprüfen soll.
Doch sobald man da angelangt ist wird der Befehl "cin.getline(Cheats, MAX);" garnicht wahrgenohmen und dadurch wird man ins Spielemenue geworfen.
Ich verstehe eifnach nciht warum er den befehl auslässt?
Ich hoffe ihr habt eine Lösung = ).Großes Danke im Voraus : D
-
Nachdem im Hauptmenü des 'c' aus dem Eingabestrom gelesen wurde, ist immer noch das newline-Zeichen im Eingabepuffer, mit dem die Eingabe des 'c' abgeschlossen wurde. Dies wird direkt vom getline im Untermenü gelesen, welches dann einfach eine leere Zeile liefert.
Zwei einfache Möglichkeiten der Abhilfe:
- In beiden Fällen getline verwenden
- Den Eingabepuffer vor dem getline leeren (mittels cin::ignore)