Problem wie ich einen empty charakter herbekomm



  • Dein Array könntest du über eine Schleife wohl ein wenig eleganter lösen. Oder ein Stringliteral verwenden, aber das ist natürlich Geschmackssache:

    const char a[] = " abcdefg...";
    

    Im Weiteren kann ich Xebov nur zustimmen, es macht keinen Sinn, das Nichts an sich einzulesen. 😉
    Wolltest du damit vielleicht ein leeres Passwort zulassen?



  • Nein ich wollte eher eine Variable länge des PWs erreichen.

    Und ein Leerzeichen ist ja nun wieder ein Zeichen.



  • dann mach doch die null rein

    const char a[70] = { 'a', 'b', ..., 'z', 0 };
    

    weil du kannst alle zeichen ja auch durch zahlen darstellen und die null ist ja quasi ein leeres zeichen...



  • Danke, das klappt anscheinend 🙂



  • Dein "empty character" wäre ein Sonderzeichen, also für Passwörter nur bedingt geeignet. Du könntest z.B. den ZWS nehmen: http://en.wikipedia.org/wiki/Zero_Width_Space . Wäre also so etwas wie

    const wchar_t emptyCharacter = 0x200B;
    

    . In "a​b" ist z.B. zwischen den beiden Buchstaben ein ZWS.



  • btw könnte man ne schöne fkt schreiben, die nen std::vector<char> befüllt...
    in dem man erstes und letztes zeichen als parameter angibt und die dann in ner schleife alle zeichen dazwischen in den vector tut...
    die ruft man dann halt einmal für 'a', 'z' auf, einmal 'A', 'Z', einmal '0', '9' und dann hat man noch ne fkt, die nur ein zeichen hinzufügt (und fügt die '\0' noch hinzu)... dann machst du einfach nen random_shuffle und baust aus dem vector nen string (sollte ja einfach mit std::string pwd (&vec[0]) gehen)...
    allerdings wird dein pwd dann im mittel 50 zeichen haben... also brauchst du noch paar 0en mehr, damit es wahrscheinlicher wird, dass es kürzer wird ^^

    bb


  • Administrator

    unskilled schrieb:

    btw könnte man ne schöne fkt schreiben, die nen std::vector<char> befüllt...
    in dem man erstes und letztes zeichen als parameter angibt und die dann in ner schleife alle zeichen dazwischen in den vector tut...
    die ruft man dann halt einmal für 'a', 'z' auf, einmal 'A', 'Z', einmal '0', '9' und dann hat man noch ne fkt, die nur ein zeichen hinzufügt (und fügt die '\0' noch hinzu)...

    Du schlägst jetzt aber nicht dies hier vor?

    void fill_range(char start, char end, std::vector<char>& vec)
    {
      for(; start != end; ++start)
      {
        vec.push_back(start);
      }
    
      vec.push_back(end);
    }
    
    // ...
    fill_range('a', 'z', vec);
    fill_range('A', 'Z', vec);
    fill_range('0', '9', vec);
    fill_range( 0 ,  0 , vec);
    

    Denn wenn doch, dann sag mir mal bitte, was der Vorteil gegenüber dem folgendem ist:

    char codepage[] = "abcdefghijklmnopqrstuvwxyz"
                      "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                      "0123456789";
    

    Meins ist nicht nur kürzer, lesbarer, klarer, sondern auch noch Standardkonformer. Man kann es manchmal schon ein wenig übertreiben mit "alles muss aus der Standardbibliothek" kommen 😉

    Grüssli



  • Skym0sh0 schrieb:

    dann mach doch die null rein [...] weil du kannst alle zeichen ja auch durch zahlen darstellen und die null ist ja quasi ein leeres zeichen...

    Von dem rate ich ab. Nicht nur, weil die Null bei C-Strings als terminierendes Zeichen angesehen wird, sondern weil es ebenfalls Zeichen benötigt, die eigentlich ungenutzt sind.

    Entweder man hat eine Anzahl Versuche für ein neues Zeichen, wobei jeder eine gewisse Chance hat, nichts anzuhängen. Oder man erzeugt eine Zufallszahl, die angibt, wie oft etwas angehängt werden soll.



  • Dravere schrieb:

    Meins ist nicht nur kürzer, lesbarer, klarer, sondern auch noch Standardkonformer.

    Und davon abgesehen Plattformunabhängiger.

    Ja, wenn sich nicht andauernd Leute darauf verlassen würden, dass 'A' bis 'Z' eine ununterbrochene Folge von aufeinanderfolgenden Ordnungszahlen sind, hätte ich nicht so oft Probleme, wenn ich C(++)-Programme auf die BS2000-Plattform (EBCDIC-Zeichensatz) portieren muss 😃



  • LordJaxom schrieb:

    Dravere schrieb:

    Meins ist nicht nur kürzer, lesbarer, klarer, sondern auch noch Standardkonformer.

    Und davon abgesehen Plattformunabhängiger.

    Ja, wenn sich nicht andauernd Leute darauf verlassen würden, dass 'A' bis 'Z' eine ununterbrochene Folge von aufeinanderfolgenden Ordnungszahlen sind, hätte ich nicht so oft Probleme, wenn ich C(++)-Programme auf die BS2000-Plattform (EBCDIC-Zeichensatz) portieren muss 😃

    oO
    das hab ich nich gewusst...

    @dravere:
    ich finds übersichtlicher... und vor allem hat man (bei änderungen) net so viel zu tippen... schon allein, weil ich keine lust hätte, das alphabet 2mal zu tippen würd ichs so machen ^^

    aber ok - wenns nich auf allen systemen portabel wäre, dann wär das freilich nich so ne dolle idee ^^

    bb


  • Administrator

    unskilled schrieb:

    oO
    das hab ich nich gewusst...

    Dabei habe ich es nun schon so oft gesagt und ich dachte, dass es sogar in Threads war, wo du dabei warst 😉

    unskilled schrieb:

    ... und vor allem hat man (bei änderungen) net so viel zu tippen... schon allein, weil ich keine lust hätte, das alphabet 2mal zu tippen würd ichs so machen ^^

    Das Eintippen der ganzen Funktionen und co ist natürlich überhaupt keine Arbeit 😃
    Das Eintippen von diesem String dagegen geschieht in ca. 15 Sekunden und ist jederzeit innert Sekunden änderbar, ohne dass man die Funktionsweise einer Funktion kennen muss... lol

    unskilled schrieb:

    aber ok - wenns nich auf allen systemen portabel wäre, dann wär das freilich nich so ne dolle idee ^^

    Ich wiederhole mich da gerne nochmals:
    Der Standard sagt nichts darüber aus, welcher Zeichensatz verwendet wird. Und es gibt auf dieser Welt auch was anderes ausser ASCII und Unicode, sogar seeeehr viele andere 😉

    Grüssli


Anmelden zum Antworten