Int Zahl Überlauf??
-
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.
-
Hmmm...da hast du allerdings recht. Daran hab ich gar nicht gedacht, scanf
kann einem ja bereits dazwischenfunken.Ich denke mal, dass es dann nicht moeglich ist, zu pruefen ob ein Overflow
stattgefunden hat, ausser man liesst die Zahl als Text ein, dann entsteht
natuerlich kein Overflow, da es ja lediglich Text ist.Man koennte die Zahl, welche man als Text einliesst, mit dem C-String
von itoa ( INT_MAX ); vergleiche, allerdings ist itoa kein ANSI-C (laut meiner
Doku). Da er aber keine C-Strings verwenden darf...Tjo, sonst wuesste ich nicht wie.
mfg
v R