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 32283 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 mars 2023 - 20 sept. 2016 à 10:18
mamiemando Messages postés 32283 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 mars 2023 - 20 sept. 2016 à 10:18
A voir également:
- Chiffrement de César
- Clé de chiffrement yuzu - Forum Jeux vidéo
- Télécharger sans chiffrement ssl - Forum Internet / Réseaux sociaux
- Le client et le serveur ne sont pas compatibles avec une version de protocole ou une méthode de chiffrement ssl commune. ✓ - Forum Internet / Réseaux sociaux
- Piece 2 euros jules cesar 2002 ✓ - Forum Loisirs / Divertissements
- Hote de service service de chiffrement - Forum Windows 10
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
32283
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
17 mars 2023
7 572
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