Variablenüberlauf verhindern
-
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.