[Caesar Code] Kleine Crypt Funktion
-
Hallo,
Ich habe als Übung eine kleine Funktion geschrieben welche einen String mit dem Caeser Code verschlüsselt. Jedoch habe ich das ein wenig modifiziert. Es ist nicht so das man eine statische cipher hat sondern dynamisch durch ein Kennwort.
Ich würde gerne eure Meinung dazu hören (Kritik, Verbesserungsvorschläge... etc.) da ich nicht all zu lange mit C++ programmiere
void s_encrypt(string& s, const string& pass) { int pass_size=pass.size(); int n=0; int cipher=0; for(size_t x=0; x!=s.size(); x++) { if (n < pass_size) { cipher = static_cast<int>(pass[n]); n++; } else { n = 0; cipher = static_cast<int>(pass[n]); } s[x]+=cipher; } }
Ich würde das vll. noch so erweitern dass da noch Fülltext dazu kommt.
Vielen Dank schon mal
-
Das sieht doch schon ganz gut aus.
Was ich noch verbessern würde
1. Arbeite statt mit Indizes lieber mit Iteratoren. Das sieht am Anfang zwar ungewohnt aus, ist aber im Zweifelsfall schneller und übersichtlicher als mit Indizes. Das könnte dann so aussehen:auto it_pass = pass.begin(); for( auto it_s = s.begin() ; it_s != s.end() ; ++it_s ) //alternativ: std::for_each, mag ich persönlich aber nicht so //in Zukunft könnte man auch das neue for im Sinne von for_each verwenden, ist //aber noch nicht besonders gut unterstützt. { *it_s += *it_pass; ++it_pass; if( it_pass == pass.end() ) it_pass = pass.begin(); }
2. Ich würde vielleicht etwas längere Variablennamen verwenden.
3. Warum static_cast?
4. Ich bin mir nicht ganz sicher, meine aber, dass Überläufe bei signed char undefined behaviour ist, das würde ich nochmal nachbessern. Entweder indem du überprüfst, ob ein Überlauf stattfindet, oder indem du nur unsigned char zulässt.
-
Danke für deine Tipps!
Ich habe jezt Iteratoren verwendet und static_cast entfernt.
void s_encrypt(string& s, const string& pass) { int n=0; int cipher=0; for(string::iterator x = s.begin(); x!=s.end(); x++) { if (n < pass.size()) { cipher = int(pass[n]); n++; } else { n = 0; cipher = int(pass[n]); } (*x)+=cipher; } }
4. Ich bin mir nicht ganz sicher, meine aber, dass Überläufe bei signed char undefined behaviour ist, das würde ich nochmal nachbessern.