Variablenüberlauf verhindern



  • 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.c

    Mein 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 main

    printf("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.


Anmelden zum Antworten