String überprüfen auf Zahlen und Kommazahlen



  • Guten Tag,

    ich habe eine Funktion mit der ich überprüfe ob der String Zahlen enthält.
    Nun möchte ich aber zusätzlich auf Kommazahlen überprüfen.
    Ist dies möglich?

    zahlen(char *z){
    	char y;
    	while ((y = *z++) != '\0'){
    	if (!isdigit(y)) return 0;
    	}
    	return 1;
    }
    

    Vielen Dank im Voraus



  • Ja, das ist möglich.



  • Wieviel Kommas dürfen in einer Zahl vorkommen?



  • Warum soll das nicht möglich sein?
    Deine Prüfung wird halt etwas aufwendiger:
    Wenn !isdigit(y) musst Du prüfen, ob y == ',' (oder '.', je nach Gusto) ist. Wenn nicht -> return 0, anderenfalls musst Du noch prüfen, ob es sich auch um das erste (einzige) Komma handelt, ist es das zweite Komma -> return 0.

    Dann musst Du entscheiden, ob es gültig ist, wenn der String mit Komman beginnt/endet und - falls nicht, ebenfalls entsprechend prüfen.



  • Ich hab schon probiert mit:

    if (!isdigit(y) || (y=='.'))
    

    bringt aber leider gar nichts.



  • Das ist "Wenn es keine Zahl ist oder ein Punkt"

    Du möchtest: "Wenn es keine Zahl und kein Punkt ist"
    oder "Wenn es keine (Zahl oder Punkt) ist"



  • Mit sscanf und %ld und %n (gibt die Anzahl der konsumierten Zeichen zurück) sollte es gehen.



  • Okay danke, ich hatte einiges verwechselt nun klappt es.



  • Ich möchte nun ausschließlich ein Komma zulassen wie kann ich das realisieren?
    Versucht hab ich das so:

    zahlen(char *z) {
    	char y;
    	int anzahl = 0;
    	while ((y = *z++) != '\0') {
    		if (y == '.')
    		{
    			anzahl++;
    		}
    		if (!isdigit(y) && (y!='.') && (anzahl<2)) return 0;
    	}
    	 return 1;
    }
    


  • 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;
    }
    

Log in to reply