String überprüfen auf Zahlen und Kommazahlen



  • Strlen gibt doch die Länge des Strings zurück.
    Deine while Schleife macht keinen Sinn, wenn kein '\0' im String enthalten ist, dann funktioniert auch strlen nicht.
    Ausserdem tut strlen in jedem Schleifendurchlauf dasselbe.
    Meinst du vielleicht das:

    ...
    


  • So wie sie es dargelegt haben erhalte ich eine Fehlermeldung.

    Ich möchte, dass wenn es eine 4-stellige Zahl ist das 1 zurückgegeben wird.
    Ist es keine Zahl oder ist die Zahl nicht 4-stellig soll 0 zurückgegeben werden.



  • Autor Nachricht Detlef7a schrieb:

    So wie sie es dargelegt haben erhalte ich eine Fehlermeldung.

    Hab vergessen z zu dereferenzieren:

    if (!isdigit(*z) || (strlen(z) != 4 )) return 0;
    

    Autor Nachricht Detlef7a schrieb:

    Ich möchte, dass wenn es eine 4-stellige Zahl ist das 1 zurückgegeben wird.
    Ist es keine Zahl oder ist die Zahl nicht 4-stellig soll 0 zurückgegeben werden.

    int laenge(char *z)
    {
        return (strlen(z) == 4) ? (isdigit(*z) & isdigit(*(z+1)) & isdigit(*(z+2)) & isdigit(*(z+3))) : 0;
    }
    

    strlen == 4 funktioniert aber nicht wenn die Zahl führende Nullen hat.



  • Den Fall schließt das hier mit ein:

    int laenge(char *z)
    {
       return (atoi(z) > 999 && atoi(z) < 10000) ? 1 : 0;
    }
    


  • genau so ist es korrekt, danke 🙂



  • Das kannst du als Anfänger überhaupt nicht beurteilen, ob etwas korrekt ist oder nicht.
    Deine "korrekte" Lösung scheitert z.B. an "+1234", "1234abc" u.ä.

    Es ist im Allgemeinen eine schlechte Idee, zeichenorientierte Probleme mit Integer-Numerik zu erschlagen.

    int laenge(const char *s)
    {
      return strspn(s,"0123456789")==4 && !s[4];
    }
    


  • Sind -1234 und +1234 keine 4-stelligen Zahlen?
    Deine Lösung akzeptiert auch 0001.



  • int laenge(const char *z)
    {
        if (!isdigit(*z) && (*z != '+') && (*z != '-')) return 0;
        const char *y = z+1;
        while (*(y++) != '\0')
            if (!isdigit(*(y-1))) return 0;
    
        return (abs(atoi(z)) < 10000) && (abs(atoi(z)) > 999);
    }
    

    Das hier akzeptiert: 1234; 01234; +1234; -1234; +01234; -01234
    Und gibt 0 zurück bei: 1234abc; 0001
    Edit: gibt 0 zurück bei ""



  • Lass es sein, das bringt nichts.
    Es geht nicht darum zu zeigen, dass man mit allerlei Handgefrickel alle möglichen Sonderfälle abdeckt, das kriegt jeder irgendwie hin, zumindestens für seine wenigen Testfällen. Allgemeinlösungen die keine Randbedingungen haben sind gefragt.
    Deine Lösung ist UB für "" und somit Müll.



  • Keine Ahnung was du möchtest, Wutz, aber der Bitmapper hat doch schon eine funktionierene Lösung geschrieben.



  • roflo schrieb:

    Keine Ahnung was du möchtest, Wutz, aber der Bitmapper hat doch schon eine funktionierene Lösung geschrieben.

    Welche nennste funktionierend?



  • volkard schrieb:

    roflo schrieb:

    Keine Ahnung was du möchtest, Wutz, aber der Bitmapper hat doch schon eine funktionierene Lösung geschrieben.

    Welche nennste funktionierend?

    Wutz hatte schon recht, allerdings sollte die letzte jetzt in Ordnung sein.


Anmelden zum Antworten