ich will aus der schleife raus

zorro2711

Grünschnabel
hallo ronny mein name und ich bin ein anfänger in sachen c++,
ich habe ein programm geschrieben und wenn ich 'n' drück wo ich ins namens menü komme komme ich aus der schleife nicht mehr raus
Code:
#include <iostream>
#include <conio.h>
#include <cstdlib>
#include <string>

using namespace std;
//variable
void name2();

//prototypen
char noname[30];

int main()
{
	


	char Menü;
do
	{
cout<<"\n\n\n\n\n\n\n\n\t\t\t<S>piel Starten\n\t\t\t<N>ame deines Helden\n\t\t\t<O>tionen\n\t\t\t<B>eenden des Spieles\n\n\t\t\t";
	
	
	cin>>Menü;
switch (Menü)
{	
	case ('s'):
	case ('S'):
	{
		cout<<"Spiel Startet jetzt";
		cout<<endl<< noname;  
		//es sollte eigenlich ein name stehn (oder text) wenn nicht vorher in knotenpunkt name ein name steht 
	

	}break;

	case ('o'):
	case ('O'):
	{
		cout<<"Optionen";
	
	}break;
	
	case ('N'):
	case ('n'):
		{

	getchar();   //warum muss das da Rein?

	  name2();

		}
	break;

	case ('B'):
	case ('b'):
	{
		cout<<"Spiel Beendet jetzt";
	
	}break;
	
	default: 
		{

		}break;

	}

}while ( Menü != 'b' &&  Menü != 'B');



system("pause");
return 0;
}

void name2 ()
{
	 char ch; 

    do 
    { 
      
	cout<<"dein name ist ?";
	cin.get (noname,30); 
	cout<<"ist dein name "<<noname<< " ?  \n <J>a oder <N>nein\n";
      
	cin.get(ch);
	cin.clear();
	


    }while (ch != 'j' && ch != 'J'); 



}
 
Hey,

also ich weiß nicht ich bin jetzt auch nicht der beste C++-Programmierer, aber du liest eine variable cin.get(ch) ein und leerst sie dann wieder mit cin.clear() oder lieg ich da falsch? Weil wenn das stimmt, bleibt er ja in der Schleife weil J oder j nie in der Variable ist :)

mfg
 
Nein, cin.clear() macht etwas anderes, es leert den Fehlerstrom von cin.

Das Problem ist, wenn du mit cin.get (noname, 30); etwas einliest und die Eingabe mit ENTER abschließt, bleibt das ENTER (\n) im Eingabepuffer von cin. Wenn jetzt im Code cin.get (ch) kommt, wird das \n aus dem Eingabepuffer in ch kopiert, und es findet gar keine Eingabeaufforderung für den Benutzer statt. Du hast deshalb in ch immer das \n gespeichert.

Um das zu umgehen, mach einfach 2 cin.get (ch).
 
Hi,
ich habe deinen Code jetzt nur überflogen, aber ich würde dir dringend empfehlen keine Umlaute in Variablen zu nutzen. Wird der Code im switch bei dir denn ausgeführt? Sonst lasst dir mal dein ch mit cout ausgeben, damit du siehst was wirklich drinnen steckt.
Grüße
 
Um das zu umgehen, mach einfach 2 cin.get (ch).

Dann gebe ich einfach 31 Zeichen ein und drücke dann Enter. Dann sind wir wieder am gleichen Ort wie vorher.

Zum Thema clear:
ios::clear macht nichts anderes als das Fehlerbit auf einen Wert (Default: goodbit) zu setzen. Effektiv macht das also eigentlich gar nichts.

Die Variante, die dich optimal auf die nächste Benutzereingabe vorbereitet ist folgende:
C++:
std::cin.sync();

Mit istream::sync werden im Eingabestrom alle noch nicht gelesenen Zeichen rausgeworfen und du kannst die neue Eingabe empfangen.
 
Zurück