Chiffrement de César
Fermé
Akalia
Messages postés
34
Date d'inscription
mercredi 25 juin 2014
Statut
Membre
Dernière intervention
17 août 2016
-
Modifié par baladur13 le 17/08/2016 à 10:50
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 20 sept. 2016 à 10:18
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 20 sept. 2016 à 10:18
A voir également:
- Chiffrement de César
- Cle de chiffrement wpa/wpa2 ✓ - Forum Freebox
- Combinaison de 5 chiffres allant de 1 à 18 - Forum Mail
- Nombre de combinaison possible avec 10 chiffres ✓ - Forum Programmation
- Combien de combinaison possible avec 3 chiffres - Forum Programmation
- Le client et le serveur ne sont pas compatibles avec une version de protocole ou une méthode de chiffrement ssl commune. ✓ - Forum Réseaux sociaux
2 réponses
Akalia
Messages postés
34
Date d'inscription
mercredi 25 juin 2014
Statut
Membre
Dernière intervention
17 août 2016
17 août 2016 à 10:35
17 août 2016 à 10:35
J'ai finalement trouvé bêtement une solution sans directement modifier la chaîne de caractères, en mettant à la place du insert, tout simplement cette ligne:
Cependant, je garde le sujet ouvert afin de savoir si le insert (ou append) est bel et bien possible, car le compilateur me le dit que c'est une histoire de out of range sur mon string, et j'aimerai bien savoir comment pallier ce problème là si je ne souhaite pas passer par cout et que je désire que ma chaîne de caractère comporte cette virgule et cet espace.
cout << *it << ", ";
Cependant, je garde le sujet ouvert afin de savoir si le insert (ou append) est bel et bien possible, car le compilateur me le dit que c'est une histoire de out of range sur mon string, et j'aimerai bien savoir comment pallier ce problème là si je ne souhaite pas passer par cout et que je désire que ma chaîne de caractère comporte cette virgule et cet espace.
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
Modifié par mamiemando le 20/09/2016 à 10:21
Modifié par mamiemando le 20/09/2016 à 10:21
Bonjour,
Disons qu'en terme de design n'y a aucune raison de recopier la chaîne sur laquelle tu appliques le traitement, ça peut se faire in place. Si ensuite tu veux conserver la chaîne original, c'est plutôt qu'il faut faire une copie en amont et altérer la copie.
Du coup tu vas plutôt passer un
Ensuite comme tu l'as indiqué, utiliser un iterator sur la chaîne est une bonne manière de l'altérer.
Ce qui donne :
Ensuite pour ces histoires de append ou autre, il faut garder à l'esprit que c'est faisable mais une mauvaise approche. Chaque append provoque une potentielle réallocation du buffer de ta string ce qui est inutilement cher.
Note : pour faire bien les choses, tu peux également ajouter l'opérateur
Bonne chance
Disons qu'en terme de design n'y a aucune raison de recopier la chaîne sur laquelle tu appliques le traitement, ça peut se faire in place. Si ensuite tu veux conserver la chaîne original, c'est plutôt qu'il faut faire une copie en amont et altérer la copie.
Du coup tu vas plutôt passer un
std::string &à ton foncteur (ou un
char *). Ensuite qu'est ce qui différencie un foncteur d'une simple fonction ? En gros, il a un constructeur, typiquement quelque chose qui permet de paramétrer la fonction, typiquement le décalage que tu vas appliquer. On pourrait également s'en sortir avec une fonction qui prendrait un paramètre template entier.
Ensuite comme tu l'as indiqué, utiliser un iterator sur la chaîne est une bonne manière de l'altérer.
#include <string> #include <iostream> struct cesar_t { size_t m_decalage; cesar_t(size_t decalage): m_decalage(decalage) {} void operator()(std::string & s) { for (std::string::iterator it = s.begin(); it != s.end(); it++) { char & c = *it; if (c >= 'a' && c <= 'z') { c = (c + m_decalage - 'a') % 26 + 'a'; } else if (c >= 'A' && c <= 'Z') { c = (c + m_decalage - 'A') % 26 + 'A'; } } } }; int main() { std::string s = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; std::cout << "s = " << s << std::endl; cesar_t cesar(13); cesar(s); std::cout << "s = " << s << std::endl; return 0; }
Ce qui donne :
(mando@velvet) (~) $ g++ cesar.cpp
(mando@velvet) (~) $ ./a.out
s = abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
s = nopqrstuvwxyzabcdefghijklm0123456789NOPQRSTUVWXYZABCDEFGHIJKLM
Ensuite pour ces histoires de append ou autre, il faut garder à l'esprit que c'est faisable mais une mauvaise approche. Chaque append provoque une potentielle réallocation du buffer de ta string ce qui est inutilement cher.
Note : pour faire bien les choses, tu peux également ajouter l'opérateur
void operator()(char * s).
Bonne chance