Int Zahl Überlauf??
-
Hallo
Eine Frage:
Wenn ich eine int Zahl mit scanf einlese, dann ist ja der Bereich der int Zahl max 2 oder 4 Byte.
Kann ich irgendwas einbauen, um zu überprüfen, ob jemand eine größere Zahl eingegeben hat?
Um dann z.B. eine Meldung zu bringe: Die Eingegebene Zahl ist zu groß
-
Guck dir mal die limits.h an
Edit: hat sich schon erledigt
[ Dieser Beitrag wurde am 03.07.2003 um 22:30 Uhr von guard editiert. ]
-
Du musst einen String einlesen und den dann umwandeln.
-
was soll die denn nützen? du kannst keinen String mit einer Zahl vergleichen, und wenns einmal ne Zahl ist, ist sie garantiert innerhalb von typ_MIN..typ_MAX
-
limits.h dürfte hier nichts bringen, schließlich weiß das Programm doch nicht, dass eine zu große Zahl eingegeben wurde und schneidet IMHO dann einfach die überhängenden Bits ab.
Du wirst es wirklich mit einem String machen müssen und diesen dann gegen die maximale int-Größe checken. Eine kleine if-Anweisung dürfte das richten
-
man könnte den string nach Ziffern durchsuchen , links beginnend, und die Ziffern in ein char-array packen. Dann kann ich abzählen, ob die Anzhal der Ziffern noch der einer int entsprechen, und gegen _MIN / _MAX prüfen, mal grob gesprochen.
Hanns
-
oder einfach strtol benutzen, das hat das alles schon eingebaut
-
Aber dann weiß hakkinen ja immer noch nicht, obe bei ner Rückgabe von LONG_MAX oder LONG_MIN, eben diese Zahlenwerte eingegeben wurden, oder ob es sich um einen Überlauf handelt
Hanns
-
errno auf ERANGE checken
-
jo, jetzt kann er loslegen
-
Hallo
Ich darf leider keinen String benutzen.Sondern die Zahl MUSS als Integer eingelesen werden
-
Original erstellt von hakkinen:
**Hallo
Ich darf leider keinen String benutzen.Sondern die Zahl MUSS als Integer eingelesen werden**
Wieso ? Angst vor Bufferoverflow ? Oder weswegen.
Du musst die Eingabe ja irgendwie speichern, entweder im
int -> keine Überprüfung möglich oder im
string -> Überprüfung möglich
-
Weil so die Aufgabenstellung von meinem Prof lautet.
"Zahl muß als Integer eingelesen werden und Programm soll auf Fehleingaben überprüfen"
Eine Fehleingabe ist für mich z.B. eine zu große Zahl
-
Dann ignorier die Aufgabenstellung und mach es richtig. Oder schmeiss dem Prof die Aufgabenstellung an den Kopf.
-
einlesen als int ist rein technisch gesehen sowieso nicht möglich, da alles
erst als char interpretiert wird... und da du daher sowieso nur das eingegebene
checkst ohne es in einen string umwandeln zu müssen verstösst daswohl auch nicht gegen die aufgabenstellung deines prof
-
Wie du siehst, fällt es vielen schwer, mal in eine Doku zu sehen.
Das will dir dein Prof. wohl beibringen.
scanf liefert einen Rückgabewert, der die Anzahl der fehlerfrei gelesenen Felder enthält. Diesen kannst du auswerten.
-
scanf betrachtet zu lange Zahlen aber nicht als Fehler.
-
Hi,
bei nem Ueberlauf wird doch das Overflow-Flag gesetzt, man koennte dieses
auswerten.mfg
v R
-
Was für ein Overflow-Flag? Das vom Prozessor? In ANSI-C? Nach scanf?
-
Jo,
meinte das vom Prozessor. Das muesste doch gesetzt werden, wenn es zu einem
ueberlauf kommt, oder etwa nur, wenn man irgendwelche Berechnungen oder
Vergleiche macht?Ist _asm kein Bestandteil von ANSI-C?
mfg
v R
-
Das ist viel zu low-level, um es auf scanf anzuwenden. Dazu müßtest du den Maschinencode der Implementierung kennen. Das OF wird ja nicht nur beim Überlauf gesetzt, sondern auch bei der nächsten Berechnung, die keinen Überlauf produziert, rückgesetzt. Also selbst wenn tatsächlich mal OF gesetzt ist, weißt du nach scanf nicht, ob es da entstanden ist wo du denkst.
BTW _asm ist nicht ANSI-C. asm ist ein C++-Schlüsselwort, aber welcher Assembler wie eingebunden wird, steht nicht im Standard.