Eingabe beendet ungewollt Programm

Das ist ja nun wieder was ganz anderes wo der entsprechende Code gar nicht enthalten ist. :rolleyes:

Wie sollen wir denn deinen Fehler nachvollziehen können, wenn du nur einen Codeschnipsel postest oder einen nicht weiter interessanten Programmtext.

Ich rate mal wild drauf los: Kann es sein, das du meinen Code so eingebunden hast:
C++:
// Hier soll eben die Überprüfung der Eingabe stehen                                                                  
if (!(cin >> zahl)) {
  if (!cin.bad() && !cin.eof()) {
    cin.clear();                                                                                                  
    cerr << "Falsche Eingabe" << endl;
  }
}
                                                                                                                                
if(zahl == 0) //->Programm mit 0 beenden                                                                        
  break;
Dann ist ja klar das das Programm beendet wird, da die Eingabe fehlgeschlagen ist und zahl automatisch mit 0 initialisiert wurde.

Du solltest die Prüfung "zahl == 0" und die Berechnung der Primzahlenzerlegung nur durchführen, wenn auch eine Zahl eingelesen wurde.

Gruß

PS: die main Funktion muss int zurückgeben.
 
Zuletzt bearbeitet:
Ok, hab auch das gelöst:
Warum verwendest du sync()? Weißt du wozu es gut ist? Ich denke mal nein.

Warum verwendest du fail() ? Ich habe doch vorhin noch erklärt, das es nicht ausreicht auf fail() zu testen.

Deine Logik ist immer noch falsch. Wenn kein Wert eingelesen wurde, kannst du auch keinen Wert ausgeben.

Wenn, dann könnte man das so machen:
C++:
cout << "Geben Sie bitte eine Ganzzahl ein: ";
if (cin >> zahl) {
  cout << "Richtige Eingabe!" << endl;
  cout << "Ihre Eingabe lautete: " << zahl << endl;
} else {
  if (!cin.bad() && !cin.eof()) {
    cerr << "Falsche Eingabe" << endl;
    cin.clear();
  }
}
Gruß
 
Also zu sync(): leert den Puffer
clear() löscht eventuell gesetzte Fehlerflags

fail() reicht vollkommen, da hier nur eine Lese- oder Schreibfehler auftritt
mit eof() wird nur überprüft, ob das Dateiende erreicht ist
bad() prüft, ob ein nicht behebarer Fehler vorliegt

ließ doch einfach die Sachen in der MSDN nach

aber vielen dank, deine Methode funktioniert auch
 
Wenn du mir nicht glaubst, hier der Code:

Code:
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;

void main()
{
	SetConsoleTitle(TEXT("Eingabeprüfung C++"));
	int zahl;
	cout << "Geben Sie bitte eine Ganzzahl ein: ";
	if (cin >> zahl) 
	{  
		cout << "Richtige Eingabe!" << endl;
		cout << "Ihre Eingabe lautete: " << zahl << endl;
	} 
	else 
	{  
		if(cin.fail())
		{
			cerr << "Falsche Eingabe" << endl;   
			cin.clear();
		}
		//if (!cin.bad() && !cin.eof()) 
		//{    
		//	cerr << "Falsche Eingabe" << endl;   
		//	cin.clear();  
		//}
	}
	cin.sync();
	cin.get();
}

Grüße
 
Und hier noch das fertige Primzahlenprogramm, dass nun jede Eingabe schluckt:

Code:
/* Primzahlenzerlegung */

#include <cstdio>
#include <iostream>
#include <windows.h>
using namespace std;

#define MAX 10000

void main() {
	SetConsoleTitle(TEXT("Primzahlenzerlegung mit C++"));
	register long zahl, ersatz;
	register unsigned int z = 0;
	register long ergebnis[MAX];
	register long a, j = 2;

	cout << "--- Primzahlenzerlegung ---\n" << endl;
	cout << "Zum beenden 0 eingeben\n" << endl;

	while(true) 
	{
		while(true)
		{
			cout << "Bitte eine Ganzzahl gr\224sser 1 eingeben: ";
			if (cin >> zahl) 
			{  
				if(zahl < 0)
				{
					zahl *= (-1);
				}
				break;
			} 
			else 
			{  
				if(cin.fail())
				{
					cerr << "Falsche Eingabe" << endl;
					cin.sync();
					cin.clear();
				}
			}
		}
		cout << "Ihre Zahl: " << zahl << endl;

		if(zahl == 0) // -> Programm mit 0 beenden
			break;

		ersatz = zahl;

		do {
			a = ersatz % j;

			if(a == 0) {
				ergebnis[z] = j;
				ersatz /= j;
				++z;
			} else {
				++j;
			}
		} while(ersatz != 1);
		
		cout << "Zerlegt in Primfaktoren:" << endl;
		if(zahl == 1)
		{
			cout << "1" << endl;
		}
		else
		{
			for(register unsigned int i = 0; i < z; i++)
			{
				if(i == (z-1)) 
				{
					cout << ergebnis[i] << endl;
				}
				else
				{
					cout << ergebnis[i] << "*" << endl;
				}
			}
		}

		z = 0;
		j = 2;
		cout << "----------------------------------------------\n" << endl;
	}
}
 
Hupps... zwei Zeilen vergessen...

Also hier the final Version:

Code:
/* Primzahlenzerlegung */

#include <cstdio>
#include <iostream>
#include <windows.h>
using namespace std;

#define MAX 10000

void main() {
	SetConsoleTitle(TEXT("Primzahlenzerlegung mit C++"));
	register long zahl, ersatz;
	register unsigned int z = 0;
	register long ergebnis[MAX];
	register long a, j = 2;

	cout << "--- Primzahlenzerlegung ---\n" << endl;
	cout << "Zum beenden 0 eingeben\n" << endl;

	while(true) 
	{
		while(true)
		{
			cout << "Bitte eine Ganzzahl gr\224sser 1 eingeben: ";
			if (cin >> zahl) 
			{  
				if(zahl < 0)
				{
					zahl *= (-1);
				}
				cin.sync();
				cin.clear();
				break;
			} 
			else 
			{  
				if(cin.fail())
				{
					cerr << "Falsche Eingabe" << endl;
					cin.sync();
					cin.clear();
				}
			}
		}
		cout << "Ihre Zahl: " << zahl << endl;

		if(zahl == 0) // -> Programm mit 0 beenden
			break;

		ersatz = zahl;

		do {
			a = ersatz % j;

			if(a == 0) {
				ergebnis[z] = j;
				ersatz /= j;
				++z;
			} else {
				++j;
			}
		} while(ersatz != 1);
		
		cout << "Zerlegt in Primfaktoren:" << endl;
		if(zahl == 1)
		{
			cout << "1" << endl;
		}
		else
		{
			for(register unsigned int i = 0; i < z; i++)
			{
				if(i == (z-1)) 
				{
					cout << ergebnis[i] << endl;
				}
				else
				{
					cout << ergebnis[i] << "*" << endl;
				}
			}
		}

		z = 0;
		j = 2;
		cout << "----------------------------------------------\n" << endl;
	}
}
 
fail() reicht vollkommen, da hier nur eine Lese- oder Schreibfehler auftritt
Nein, das reicht nicht. Wie kommst du darauf, dass kein EOF oder sonstiger schwerer Fehler auftreten könnte? sync kann z.B. auch das badbit setzen...
mit eof() wird nur überprüft, ob das Dateiende erreicht ist
Falsch. eof() prüft nur ob der das eofbit gesetzt ist. Es sagt nichts darüber aus, ob das Dateiende bereits erreicht ist. (ja, das ist ein Unterschied)
bad() prüft, ob ein nicht behebarer Fehler vorliegt
Richtig.
ließ doch einfach die Sachen in der MSDN nach
Ich brauche es nicht in der MSDN nachzulesen. Erstens ist das keine normative Referenz und zweitens weiß ich was es bedeutet.

Gruß
 
Zurück