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 33499 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 28 janvier 2025 - 20 sept. 2016 à 10:18
mamiemando Messages postés 33499 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 28 janvier 2025 - 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
- Combien de combinaison possible avec 3 chiffres - Forum Programmation
- Nombre de combinaison possible avec 10 chiffres ✓ - Forum Programmation
- Tous les code possible de 0 à 9 (4 chiffres ) liste - Forum Jeux vidéo
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
33499
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
28 janvier 2025
7 818
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