String "inkrementieren"



  • Hallo,

    ich bräuchte eine Funktion welche mir alle n-stelligen Wörter mit einem bestimmten Charset ausgibt. Etwa alle alphanums mit :

    char charSet[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
    

    Wenn ich dann mit

    char* init = "000000";
    

    z.b. ein 6-stelliges Wort initialisiere, will ich jetzt dieses Wort mit obig genanntem charSet "inkrementieren". Also es soll zuerst 000001 ausgegeben werden, nach 000009 dann 00000a, nach 000Z00 dann 001000 usw. bis zum letzten Wort "ZZZZZZ".

    Mein momentaner Ansatz ist: (Annahme: char* init ist Instanzvariable)

    void inkrement(){
    	char tmp = init[strlen(init) - 1]; // char an letzter letzte Stelle
    	if (tmp != '9'){
    		++tmp;
    		return;
    	}
    	int x = 2;
    	while (tmp == '9'){
    		tmp = '0';
    		tmp = init[strlen(init) - x];
    		++x;
    	}
    
    }
    

    aber das funktioniert so nur für 0-9 und nicht für die Buchstaben 😞 Die Funktion muss nicht sonderlich effizient sein, es reicht mir wenn sie es irgendwie schafft. Kann mir wer helfen? evtl auch mit nem anderen Ansatz?

    Das ist mein Teil in ner Gruppenarbeit, geht um Passwortsicherheit und Beispiele dazu. Ich soll eine Methode machen welche eine globale Variable "inkrementiert", der charSet ist momentan konstant, soll aber später frei wählbar sein.



  • Du arbeitest ja gar nicht auf dem definierten Charset, sondern auf '0' - '9'?!
    Also ungefähr so:

    ...
    char *charSet = "01234567890abcdefghij";
    ...
    char* init = "000000";
    ...
    
    void inkrement(){
        char tmp = init[strlen(init) - 1]; // char an letzter letzte Stelle
        char maxChar = charSet[strlen(charSet) - 1];
    
        if (tmp != maxChar){
          //  ++tmp;
            int i = 0;
            for(; i < strlen(charSet); ++i)
               if(charSet[i] == tmp)
                  break;
    
            tmp = charSet[++i];
            return;
        }
    
    ...
    
    }
    


  • vielen Dank für die Antwort.

    Das scheint aber nur für die letzte Stelle zu gehen. Ein 00000Z wird zu einem 000000 ?

    0ZZZZZ wird ein 0ZZZZ0



  • Du musst Dich natürlich um die vorletzte Stelle kümmern, wenn Du die letzte von 'Z' auf '0' inkrementierst. Das hast Du doch in Deinem Ursprungsposting auch gemacht?!



  • Das ist doch ein ganz normales Programmierproblem. Wenn Du programmieren kannst, kannst Du Dir die Funktion schreiben. Wenn Du es nicht kannst, dann musst Du das eben lernen. Oder willst Du hier eine fertige Lösung für deine Gruppenarbeit? Das wäre natürlich sehr viel bequemer für dich.

    Phtevenz schrieb:

    Kann mir wer helfen? evtl auch mit nem anderen Ansatz?

    Das ist mein Teil in ner Gruppenarbeit...

    Und überhaupt finde ich es schon befremdlich, wie schlechtes deutsch hier überhaupt geschrieben wird. "Kann mir jemand helfen?" wäre eine korrekte deutsche Frage. Und "nem" steht ganz bestimmt nicht im Duden. Und "ner" auch nicht.



  • Vorschlag: Statt für ein Zeichen immer wieder den Index in charSet zu suchen, würde ich mir den Index einfach auch in einem Int-Array merken. Laufzeit ist ja schon wichtig, wenn Du damit Passwörter knacken willst. 🙂

    Phtevenz, wie soll man dir denn helfen, ohne die Lösung zu verraten?

    tntnet schrieb:

    Und überhaupt finde ich es schon befremdlich, wie schlechtes deutsch hier…

    🙄
    Für Dein Ohr klingt das vielleicht komisch aber in einigen Gegenden ist das normal.



  • krümelkacker schrieb:

    tntnet schrieb:

    Und überhaupt finde ich es schon befremdlich, wie schlechtes deutsch hier…

    🙄
    Für Dein Ohr klingt das vielleicht komisch aber in einigen Gegenden ist das normal.

    Aber sich dann beschwern, dass nur die wenigen antwortn, wo in ner Gegend lehm, wo mer so nen Dialekt sprechn!



  • krümelkacker schrieb:

    Vorschlag: Statt für ein Zeichen immer wieder den Index in charSet zu suchen, würde ich mir den Index einfach auch in einem Int-Array merken. Laufzeit ist ja schon wichtig, wenn Du damit Passwörter knacken willst. 🙂

    Phtevenz, wie soll man dir denn helfen, ohne die Lösung zu verraten?

    tntnet schrieb:

    Und überhaupt finde ich es schon befremdlich, wie schlechtes deutsch hier…

    🙄
    Für Dein Ohr klingt das vielleicht komisch aber in einigen Gegenden ist das normal.

    Beim Sprechen ja, aber beim Schreiben?



  • tntnet schrieb:

    Das ist doch ein ganz normales Programmierproblem. Wenn Du programmieren kannst, kannst Du Dir die Funktion schreiben. Wenn Du es nicht kannst, dann musst Du das eben lernen. Oder willst Du hier eine fertige Lösung für deine Gruppenarbeit? Das wäre natürlich sehr viel bequemer für dich.

    Phtevenz schrieb:

    Kann mir wer helfen? evtl auch mit nem anderen Ansatz?

    Das ist mein Teil in ner Gruppenarbeit...

    Und überhaupt finde ich es schon befremdlich, wie schlechtes deutsch hier überhaupt geschrieben wird. "Kann mir jemand helfen?" wäre eine korrekte deutsche Frage. Und "nem" steht ganz bestimmt nicht im Duden. Und "ner" auch nicht.

    Mir war nicht klar, dass hier so viel Wert auf die Ausdrucksweise gelegt wird. Zumindest meinerseits steht der Inhalt im Vordergrund. Wenn ich es nicht kann dann frage ich um Hilfe, das habe ich hiermit getan. Eine fertige Lösung habe ich mittlerweile selber. Dank an Belli, das war der Denkanstoß nach dem ich gesucht habe.

    Wo wir gerade bei Rechtschreibung sind, ich bin da offensichtlich kein Experte, aber "deutsch" schreibt man glaube ich "Deutsch", aber ist ja nicht so wichtig bei genau diesem Wort. Sachen wie "nem" und statt "jemand" ein "wer" zu benutzen würde ich ganz nach Duden als "umgangssprachlich" bezeichnen oder auch "regional anerkannt". Hier nur ein Link auf einen Onlineduden http://www.duden.de/rechtschreibung/jemand

    Genug gesocialised. Für alle die es interessiert hier der C++ Code:

    char getNext(char c){
    	int i = 0;
    	for (; i < setLength; ++i) //index des zu inkrementierenden chars im charSet suchen. bsp : c = d , i = 13
    		if (c == charSet[i])
    			break;
    	if (i < (setLength - 1))
    		return charSet[i + 1];
    	else
    		return charSet[0];
    }
    
    void incrementTry(){
    	int x = pwdSize - 1;
    	char tmp = pwdTry[x];
    	//printf("\n checking char %c", tmp);
    	if (tmp != charSet[setLength - 1]){ //nur eine stelle zu ändern
    		char c = getNext(tmp);
    		pwdTry[x] = c;
    	}
    	else{		// was passiert bei 0ZZZZZ ? alle Z umdrehen
    		while (tmp == charSet[setLength - 1] && (x>0)){
    			char c = getNext(tmp);
    			pwdTry[x] = charSet[0];
    			--x;
    			tmp = pwdTry[x];
    			if (tmp != charSet[setLength - 1])
    				pwdTry[x] = getNext(tmp);
    		}
    	}
    }
    

    Wichtig!

    Hierbei wird vorausgesetzt, dass folgende vier globale Variablen existieren:
    std::string pwdTry = "000000";

    std::string pwdTry = "000000";
    char charSet[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
    int setLength = sizeof(charSet)/sizeof(char);
    int pwdSize = pwdTry.length();
    

    Nach nem Aufruf von incrementTry() wird pwdTry um eins "erhöht" je nach charSet. Wer mag kann den charSet auch anpassen, soweit ich gesehen habe funktioniert es auch mit Umlauten. Bis auf '\0' natürlich. Wobei ich nicht wüsste wie das wer am Keyboard als Passwort eintippen kann.

    Es handelt sich hierbei zwar um Passwortgenerierung, aber es soll nur Beispielhaft erwähnt werden. Laufzeit steht bei meiner Gruppe (noch?) nicht im Vordergrund. Falls wer das Thema Laufzeit in diesem Zusammenhang diskutieren will, gerne 👍


Log in to reply