Variablenüberlauf verhindern
-
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
-
|silver| schrieb:
Wieso kryptisch?
Weil
if (wert[0] == '-' || wert[0] == '+' || wert[index] >= '0' && wert[index] <= '9' )
eindeutig verständlicher ist.
|silver| schrieb:
aber beim wert[1] "-" oder "+" ist doch die if-Bedingung eigentlich false...
Nö. wert[0] ist doch immer noch '-' oder '+'. Und || bedeutet nunmal logische Oder-Verknüpfung. Dh, mindestens einer der zu verknüpfenden Ausdrücke muss wahr sein, damit der Gesamtausdruck wahr ist.