String überprüfen auf Zahlen und Kommazahlen



  • Immer diese Logik 😉

    if ((!isdigit(y) && y!='.') || anzahl>=2) return 0;
    


  • if(
       (!isdigit(y) && (y != '.')) // weder Ziffer noch . 
         || (anzahl > 1)           // mehr als ein .  
      ) return 0;
    


  • Danke.

    Allerdings beschäftigt mich noch ein Problem.

    Ich würde gern ein Datum einlesen lassen und überprüfen ob es in der üblichen Form (xx.xx.xxxx) vorhanden ist oder wäre es hier besser einzeln nach Tag,Monat und Jahr zu fragen?



  • scanf("%2d.%2d.%4d", &tag, &monat, &jahr);
    


  • So nun hoffentlich zum letzten mal, ich würde gern die Länge eines Strings bestimmen. Ungefähr in der folgenden Form. Wie kann ich die Länge vom eingegebenen String ermitteln?

    laenge(char *z) {
    	char y;
    		int laenge;
    		while ((y = *z++) != '\0') {
    			laenge = strlen(?);
    			if (!isdigit(y) || (laenge!=4)) return 0; 
    		}
    		return 1;
    	}
    


  • Was meinst du was strlen macht?

    size_t laenge(char *z)
    {
        return strlen(z);
    }
    


  • Also wenn ich z mit in die Funktion schreibe funktioniert anschließend der Vergleich nicht.
    Wenn ich die Länge als zweiten Parameter deklariere und anschließend länge=strlen()in der main -Funktion schreibe geht das so wie ich es mir vorstelle. Allerdings hätte ich es gern in der Funktion mit drin.



  • 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