Variablenüberlauf verhindern
-
Schönen guten Tag,
bin jetzt seit paar Tagen am C lernen
Hab nun ein Problem:
Ich hab ein Menü, darum hab ich eine do-While Schleife gebaut,
} while(scanf("%d",&variable) == 0);
Hab eine int Variable... Schleife wird nur verlassen wenn ein gültiger Wert eingegeben wird (also eine Ganzzahl) bei .net geht der int Bereich von -2147483648 bis 2147483647... wenn jetzt aber eine zu große Zahl eingegeben wird, dann gibts probs. Besonders wenn die Variable 2x überläuft...
Welche Lösung gibt es da?Schonmal danke für die Hilfe
-
leg doch einfach fest, das bei einer bestimmten eingabe, z.b. einem bestimmten
buchstaben, dein programm beendet werden soll.while (toupper(zeichen)!='E');
-
ja der Abbruch verhindert aber noch nicht den Variablenüberlauf...
wir sollen versuchen das zu verhindern.... hab aber nicht richtig den Plan wie...http://www.htw-dresden.de/~s53772/eingabe_Menu.c
Will ja dann "reinswitchen"... wenn die Variable 2x überläuft bin ich wieder im positiven und komme unter umständen in ein Menü rein, was gar nicht gewählt wurde...
-
Mit Standard Mitteln geht sowas afaik nicht.
Dann musst du wohl oder übel die Eingabe manuell verarbeiten, sozusagen ein primitives scanf selbst schreiben. Dann kannst du auch den Wertebereich überwachen und bei Bedarf weitere Eingaben blocken.
-
#include <stdio.h> #include <limits.h> int main(void){ long long n; scanf("%lld",&n); if( n < INT_MIN || n > INT_MAX ) printf("Zu gross fuer int32\n"); else printf("%lld\n",n); return 0; }
Ist nach standardkonform nach C99.
-
leider bringt das Programm nicht den gewünschten erfolg...
bei Eingabe von 222222222222 (12x2)
bekomm ich als Ausgabe-1116077170.... sprich mir läuft der Kahn über
-
speicher die Eingabe des Users erst mal in einem String - dann überpüfe, ob die Zahl (repräsentiert durch einen String) nicht das Interval deines Datentyps sprengt
-
@TactX
Du weitest den Wertebereich für das Problem nur aus, abschalten tust du es damit jedoch nicht.
-
groovemaster schrieb:
@TactX
Du weitest den Wertebereich für das Problem nur aus, abschalten tust du es damit jedoch nicht.Stimmt
-
Du weitest den Wertebereich für das Problem nur aus, abschalten tust du es damit jedoch nicht
dieses Manko hat meine String Methode allerdings auch
-
Wieso?
-
Weil der String auch nur 'ne bestimmte L"ange hat.
-
Aber der String kann lang genug sein, um alle Zahlen eines Integers darzustellen.
-
Das ist ein long long auch.
-
Aber das long long kann bei der Eingabe über scanf() selbst überlaufen.
-
Lösung mit string:
char eingabe[12]; ... //Eingabe innerhalb der Schleife fgets(eingabe, 12, stdin); if(strchr(eingabe, '\n') == 0) { //Eingabe zu groß! //bis zum Enter einlesen while(strchr(eingabe, '\n') == 0) fgets(eingabe, 12, stdin); //Und nochmal eingeben lassen continue; } //hier folgt die Prüfung auf die Zahl ...
-
Hi,
danke erstmal für die Information, allerdings höre ich fgets heut zum Ersten mal
wie implementier ich das jetzt in den Code richtig?
http://www.htw-dresden.de/~s53772/eingabe_Menu.cMein Versuch hat sich nicht bewehrt
-
So wollte keinen neuen Tread aufmachen (Übersichtlichkeit halber :))
...
char wert[12]; //Aus maximal 11 Zeichen kann/darf die Zahl bestehen
int index, laeng;
long rueckgabe=0; //Rückgabewert an mainprintf("Bitte Zahl vom Typ long eingeben:\n");
printf("Abbruch bei Eingabe von Buchstaben oder Sonderzeichen!\n");
scanf("%11s",&wert);//Überprüfen ob der Sting nur Zahlen und ein "-" oder "+" am Anfang enthält
for (index=0, laeng=strlen(wert); index<laeng; index++)
{
if (wert[0] == 45 || wert[0] == 43 || wert[index] > 47 && wert[index] < 58 )
continue; //Wenn alles Okay mit den Zeichen, dann fahre fort...
else { //Falls ein Buchstabe oder Sonderzeichen auftritt
printf("Fehler bei der Eingabe!\n");
getch();
exit(1); }
}
...Wenn ich "++5" oder "+f" eingebe... müsste er ja auch in exit reinspringen... das macht er aber nicht. Kann mir nicht wirklich erklären warum...
Danke für Tipps
-
|silver| schrieb:
Wenn ich "++5" oder "+f" eingebe... müsste er ja auch in exit reinspringen...
Nö, wieso? Ein + oder - zu Beginn reicht für die if Abfrage doch schon aus, damit wahr rauskommt.
btw:
Benutze Code-Tags.
if (wert[0] == 45 || wert[0] == 43 || wert[index] > 47 && wert[index] < 58 )
Warum so kryptisch verschlüsselt? Schreib Klartext!
-
Wieso kryptisch? Das ist doch der normale ASCII-Code...
mh ja wenn wert[0] ein "-" oder "+" ist muss die if-Bedingung true sein, aber beim wert[1] "-" oder "+" ist doch die if-Bedingung eigentlich false... er müsste in else Zweig gehen und das Programm beenden. Macht er aber nicht