Wie funktionieren mehrfache Konsoleneingaben?

Ignus

Mitglied
Hallo,

ich bin in c++ absolut neu und arbeite gerade das Onlinebuch "http://www.highscore.de/cpp/einfuehrung/" durch.

Jetzt hab ich mir mal, um auch alle Aufgaben mal brav gemacht zu haben, ein kleines Programm geschrieben.
Description dazu: Ich habe mir zu jedem Test eine Funktion(mit Codeschnippes) gebastelt welche ich nach dem Programmstart zur Auswahl habe und über eine Eingabe in die Konsole wähle.
Code:
void selectIT()
{
	char cEingabe[2];
	std::cout << "Bitte wähle (per Zahl) eines der folgenden Programmfunktionen: \n" << std::flush;
	std::cout << "1. testA(): Textdatei-Ausgabetest \n" << std::flush;
	std::cout << "2. testB(): Eingabetest \n" << std::flush;
	std::cout << "3. testC(): Booleantest  \n" << std::flush;//flush;
	std::cout << "4. testD(): DoubleRechentest \n" << std::flush;
	std::cout << "5. testE(): StringArraytest \n" << std::flush;
	std::cout << "6. testF():  \n" << std::flush;
	
	std::cin.get(cEingabe, 2); //Konsolen-Eingabeaufforderung
	
	if(std::atoi(cEingabe) == 1){testA();}
	if(std::atoi(cEingabe) == 2){testB();}
	if(std::atoi(cEingabe) == 3){testC();}
	if(std::atoi(cEingabe) == 4){testD();}
	if(std::atoi(cEingabe) == 5){testE();}
	if(std::atoi(cEingabe) == 6){testF();}
	
	printf("\nAlles Käse!");
}
testA(); testB(); usw. sind meine Testfunktionen mit den Codeschnipseln.
Jetzt kommt das Problem: Wenn ich innerhalb einer solchen Funktion, Bsp.:
Code:
void testB()
{
	char Buffer[20];
	std::cout << "Pls gib irwas ein! " << std::flush;
	std::cin.get(Buffer, 20);
	std::cout << "Du hast \"" << Buffer << "\" geschrieben? Selber schuld!" << std::endl;
}
eine 2te Eingabe fordere funktioniert das nicht. Das Programm läuft einfach durch und ist beendet ohne die 2te Eingabe abzuwarten. Was mache ich falsch?
 
Hi

also, mit der Klasse habe ich mich eigentlich nie wirklich beschäftigt, aber das ist von scanf ein bekanntes Problem.

Bau nach jedem Einlesen ein
fflush(stdin);
ein...vielleicht hilfts ja.

gruß
 
Darf ich fragen warum du nicht zum auswähle eine Integer Variable nutzt sondern über ein Array gehst?

C++:
...
std::cout << "5. testE(): StringArraytest \n" << std::flush;
//Das selbe
std::cout << "5. testE(): StringArraytest" << endl;
..
Gruß XeoX
 
Hallo,

mit der Schreibweise std::cin >> Buffer; funktioniert es.
@sheel: Mit deiner Schreibweise bekomme ich garnix gebacken :suspekt:

Dummer Weise findet man überall die unterschiedlichsten Schreibweisen als Anfänger und weis garnicht was jetzt besser oder anders ist, bis man an solchen simplen Hindernissen scheitert. *Jaja, kauf dirn Buch* Pfffhh beim heutigen Internet sollte man sich doch Vorstellen können dass es, wie bei Java, VB, html & Co., auch ohne Buch geht. Vielleicht lebe ich da bei c++ in einer Traumwelt ^^"

Das flush und endl hab ich so relativ willkürlich gesetzt, weil ich eigendlich keinen Blassen habe was die Dinger bewirken. Zumal ich das ganze Zeug mit & ohne flush oder endl schreiben kann. Oder sogar alles nur über printf.

Das Onlinezeug/-beschreigung ist ja zu dieser sehr verbreiteten Programmiersprache mehr als nur dürftig. -.-*

@XeoX ich hab keine Ahnung warum ich char genommen habe *g*
Ich nehm an weil es auf der Internetseit nirgends anders beschrieben war. Aber hast auf jedenfall Recht. So habe ich wenigstens mit ein paar Funktionen rumspielen können von denen ich nix weis. :rolleyes:

Ich danke Euch!

Mfg Ignus
 
Mal zu Erklaerung:

flush loescht meines Wissens nach den Ausgabepuffer.
endl ist eine Abkuerzung von "endline" und erzeugt folgerichtig einen Zeilenvorschub ala Enter.

die Geschichte mit dem get ... 1 Zeichen einlesen mit getch(variable) oder du machts das mit cin.getline(variable, Anzahl Zeichen).

was aber noch wichtiger ist und vermutlich das Problem ausloesst, du musst nach einer Eingabe den Einlesepuffer wieder loeschen was man mit cin.clear(); cin.sync(); hinbekommt. evtl kann es passieren, dass get naemlich merkt, dass noch was im Einlesepuffer ist und entsprechend irgendwas einliesst.

Letzteres ist Spekulation, die Geschichte mit dem Lesepuffer existiert aber auf jeden Fall. ;)
 
Zurück