C++ unsigned long long int überprüfen

Karambo

Ensign
Registriert
Feb. 2008
Beiträge
131
Hallo!

Wie kann ich überprüfen, ob eine eingegebene Variable (unsigned long long int) <=0 und/oder > 18446744073709551615 ist und anschließend die Variable neu setzen kann, falls sie eine der Kriterien erfüllt? Die Variable soll max. 18446744073709551615 und min. 1 sein.
Code:
do
	{
	cin >> iZahl;
		
	if (iZahl <= 0)
		{
		cout << endl << "Ungueltige Eingabe. Bitte geben Sie eine andere Zahl ein";
		bIZahl = false;
		Sleep (1500);
		Head1(); //nicht relevante Funktion ;)
		}
	else bIZahl = true;

	}while (bIZahl == false);

Wenn die Variable = 0 ist, dann springt er wieder zu "cin" zurück. Wenn ich aber z.B. "-35763" eingebe, verlässt er die Schleife und gibt später eine riesige Zahl aus.
Bei > 18446744073709551615 war ich noch nicht...


Vielen Dank,


Karambo
 
Hast du schonmal geprüft, ob das Lesen mit cin erfolgreich war? Einfach ein if (cin) { ... }. Das prüft das Failbit. Im Übrigen bleibt das Failbit nach einem Parsefehler gesetzt. Man muss es dann mit cin.clear(); zurücksetzen. Allerdings muss man in diesem Falle auch ggf. ungültige Bytes aus dem Stream entfernen, da die Zeichen von cin dann nicht konsumiert wurden.

<= 0 macht bei unsigned nicht wirklich viel Sinn, da der Wertebereich bei 0 nach unten hin endet. Du solltest Dir mal 2er-Komplement-Darstellung anschauen um zu verstehen, was der Compiler da treibt. ;)
 
Das <= 0 war eher dafür gedacht, falls der Nutzer trotz des Hinweises eine negative Zahl oder 0 eingibt, damit die Eingabe korrigiert werden kann...
Ergänzung ()

Habe mal nachgeschaut, was er z.B. mit -56546 anfängt. Er rechnet 18446744073709551616 - 56546. Also (Max+1)- (+iZahl)...
Ergänzung ()

Sry, wegen einer 2. Ergänzung: Neue Erkenntnis ^^. Größere Zahlen als 18446744073709551615 werden nicht in die Variable gespeichert. Habe sie jetzt am Anfang mit 0 initialisiert, um größere Zahlen als ... (nichts gespeichert -> Variable nach wie vor auf 0) mit if (iZahl == 0) zu erkennen.
Bleibt das Problem mit Eingaben von z.B. "-..." ...
 
Source für c++03 konforme Compiler:

Code:
#include <iostream>
#include <sstream>
#include <string>


using namespace std;

typedef unsigned long long ULL;

bool read_big_number(ULL& res) {
	string line;
	getline(cin, line);
	if(cin) {
		if(line.find_first_not_of("0123456789") != string::npos)
			return false;
			
		istringstream is(line);
		return !(is >> res).fail();
	}
	return false;
}

int main() {
	ULL r=0;
	while(!read_big_number(r) || r == 0)
		cerr << "Ungueltige Eingabe. Bitte geben Sie eine andere Zahl ein\n";
	
	cout << "Zahl: '" << r << "'\n";
}

Problematik rührt daher, dass 18446744073709551615 == 2^64-1 gilt und negative Zahlen einfach vorzeichenlose Zahlen uminterpretiert werden. Der Test line.find_first_not_of("0123456789") != string::npos stellt sicher das der String nur aus Ziffern besteht. Der istringstream übernimmt dann die Bereichsprüfung.

@[GP] mino: Reguläre Ausdrücke sind imo nicht voraussetzbar für c++03 konforme Compiler. Bei meiner vorherigen Version konnte man auch sowas wie "111 222" eingeben.
 
Zuletzt bearbeitet: (Überarbeitet)
mach mal den hier. wenns kein unsigned LL ist, wird ein fehler geworfen.
Code:
#include <iostream>
#include <sstream>
#include <string>
#include <regex>

template <class T>
bool from_string(T& t, const std::string& s, std::ios_base& (*f)(std::ios_base&))
{
	std::istringstream iss(s);
	return !(iss >> f >> t).fail();
}

int main(int argc, char *argv[])
{
	
	std::cout << "mach mal uLL eingabe: " << std::endl;

	std::string str;
	std::cin >> str;

	std::tr1::regex rx("[0-9]{1,20}");
	if (regex_match(str.begin(), str.end(), rx))
	{
		unsigned long long uLL = 0;
		if(from_string<unsigned long long>(uLL, str, std::dec))
		{
			std::cout << uLL << std::endl;
		}
		else
		{
		    std::cout << "ungueltige uLL eingabe." << std::endl;
		}
	}
	else
	{
		std::cout << "ungueltige uLL eingabe." << std::endl;
	}
	return 0;
}

kannst den regex auch tunen, ist jetzt auf die schnelle hingekritzelt. mehr zu regulären ausdrücken hier.
 

Ähnliche Themen

Zurück
Oben