Bin Anfänger in C++, mein Konsolenprogramm spinnt (CMD)!



  • Ich hoffe mal, dass ich das richtige Subforum ausgesucht habe. 😕 Ich habe ein Programm geschrieben, das einen dazu auffordert eine Zahl einzugeben. Wenn man "99" eingibt, kommt man raus. Ich habe einen Art Bug 😉 gefunden und kann ihn selber nicht lösen: Wenn man ++99 oder --99 eingibt, landet das Programm in einer Art Loop. Ich habe es by the way aus einem Buch entnommen (Schrödinger programmiert C++ [2.Auflage mit C++14]).Hier erstmal der Code:

    #include <iostream>
    #include <cstdlib>
    using namespace std;
    
    int main() {
    	int eingabe;
    	do {
    		cout << "-1- Circle of Life\n";
    		cout << "-2- Endless summer\n";
    		cout << "-3- Boring Things\n";
    		cout << "-99- Exit only\n";
    		cout << "Your choice: \n";
    		cin >> eingabe;
    		//if (reinterpret_cast<int>(eingabe) == "++99" || reinterpret_cast<int>(eingabe) == "--99")   .. hier habe ich versucht ++/--99 als Ausnahme hinzuzufügen praktisch
    		if (eingabe == -858993460 /* || eingabe == "--99"*/) //Am Anfang steht der herausgefundene Zahlenwert bzw. Integerwert von ++/--99
    		{
    			cout << endl;
    			continue;
    		}
    		else { cout << "Bugfix\n"; }
    	} while (eingabe != 99);
    	cout << "Yeah, you're out!\n";
    	/*int test; // Hier wollte ich den Zahlenwert von ++99 und -99 rausfinden, 2 mal das Gleiche, siehe oben bei der if-bedingung
    	cout << "Gib einen Testwert ein: \n";
    	cin >> test;
    	cout << test;*/
    	system("PAUSE");
    	return 0;
    }
    

    Hier dann noch die Debuggingaausgabe (Das Programm an sich ist lauffähig):
    "meinProjekt.exe" (Win32): "C:\Users\******\Documents\Visual Studio 2017\Projects\meinProjekt\Debug\meinProjekt.exe" geladen. Symbole wurden geladen.
    "meinProjekt.exe" (Win32): "C:\Windows\SysWOW64\ntdll.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden.
    "meinProjekt.exe" (Win32): "C:\Windows\SysWOW64\kernel32.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden.
    "meinProjekt.exe" (Win32): "C:\Windows\SysWOW64\kernel32.dll" wurde entladen.
    "meinProjekt.exe" (Win32): "C:\Windows\SysWOW64\kernel32.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden.
    "meinProjekt.exe" (Win32): "C:\Windows\SysWOW64\KernelBase.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden.
    "meinProjekt.exe" (Win32): "C:\Windows\SysWOW64\msvcp140d.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden.
    "meinProjekt.exe" (Win32): "C:\Windows\SysWOW64\vcruntime140d.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden.
    "meinProjekt.exe" (Win32): "C:\Windows\SysWOW64\vcruntime140d.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden.
    "meinProjekt.exe" (Win32): "C:\Windows\SysWOW64\vcruntime140d.dll" wurde entladen.
    "meinProjekt.exe" (Win32): "C:\Windows\SysWOW64\ucrtbased.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden.
    "meinProjekt.exe" (Win32): "C:\Windows\SysWOW64\ucrtbased.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden.
    "meinProjekt.exe" (Win32): "C:\Windows\SysWOW64\ucrtbased.dll" wurde entladen.
    Der Thread 0x2948 hat mit Code -1073741510 (0xc000013a) geendet.
    Der Thread 0x1b9c hat mit Code -1073741510 (0xc000013a) geendet.

    Wäre super, wenn jemandem was einfallen würde 😃 👍

    Mod-Edit (camper): Code-Tags



  • In deinen ifs vergleichst du Äpfel mit Birnen. So steht das sicherlich nicht in deinem Buch.



  • Was soll das mit dem ++99, das ist kein Integer.
    Du erhältst einen Integer als Eingabe cin>>eingabe //ist Int-Wert
    Der Loop ist doch gewünscht und wird mit der Eingabe 99 abgebrochen, ansonsten geht es immer so weiter. Das soll auch wahrscheinlich das Programm verdeutlichen.



  • "++99" und "--99" sind keine Zahlen, sondern Zeichenketten. Das ist das Grundproblem an deinem Programm.

    Du liest aber in die int-Variable "eingabe". Da "++99" keine Zahl ist, schlägt das Einlesen fehl und bei cin wird das fail-bit gesetzt. Das bedeutet, dass weitere Eingeben sofort fehlschlagen, bis dieser Fehlerstatus gelöscht wird. (-> std::cin.clear(std::istream::failbit); )

    Lösung: lies stattdessen per getline einen std::string ein und vergleiche diesen auf "++99".

    Eine Frage hätte ich noch: woher kennst du reinterpret_cast ? Das brauchst du als Anfänger nicht - und auch ansonsten nur sehr sehr selten. Falls du es doch einmal brauchst, solltest du genau wissen, warum du es brauchst und warum es dort funktioniert.



  • Ja, entweder Zeichenketten vergleichen, oder sich an die Eingabemöglichkeiten halten.
    1,2,3,99.
    Da es ein Beispiel aus einem Buch ist, ist hier keine Fehlerbehandlung vorhanden, wenn man die richtigen Werte eingibt, dann passiert auch nichts.
    Im richtigen Leben, müßte man das absichern, aber als Anfänger solltest Du Dich erst mal auf den normalen Programmablauf konzentrieren.



  • Erstmal danke für die Antworten, mich hat nur interessiert wie man das lösen würde.

    wob schrieb:

    Eine Frage hätte ich noch: woher kennst du reinterpret_cast ? Das brauchst du als Anfänger nicht - und auch ansonsten nur sehr sehr selten. Falls du es doch einmal brauchst, solltest du genau wissen, warum du es brauchst und warum es dort funktioniert.

    reinterpret_cast kam im Buch bei der impliziten Typumwandlung vom Compiler vor (und eben der expliziten durch dem Coder). Da wurde angesprochen, dass dieser dazu fähig ist alles irgendwie umzuwandeln, also habe ich es ausprobiert (von char zu int, war aber keine gute Idee 😃 ). Mir ist aber bewusst, dass ich als Anfänger eigentlich die Finger von solchen Umwandlungen lassen soll. 🙂



  • KN4CK3R schrieb:

    In deinen ifs vergleichst du Äpfel mit Birnen. So steht das sicherlich nicht in deinem Buch.

    Die habe ich ja hinzugefügt, um den "Bug" zu fixen. Steht natürlich so nicht im Buch 👍


Log in to reply