Le codage de cesar ....mais ouuups il n'affiche pas le code????
Fermé
kazanani
-
Modifié par Whismeril le 19/10/2015 à 07:07
jackdada Messages postés 77 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 10 février 2016 - 20 oct. 2015 à 19:48
jackdada Messages postés 77 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 10 février 2016 - 20 oct. 2015 à 19:48
A voir également:
- Le codage de cesar ....mais ouuups il n'affiche pas le code????
- Codage ascii - Guide
- Codage binaire - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
- Code puk bloqué - Guide
- Code activation windows 10 - Guide
2 réponses
jackdada
Messages postés
77
Date d'inscription
vendredi 31 juillet 2015
Statut
Membre
Dernière intervention
10 février 2016
19
19 oct. 2015 à 04:24
19 oct. 2015 à 04:24
Bonjour,
Évite de faire des doublons de postes merci.
Pour ton problème, il est du au fait que le caractère stocker dans la variable c n'est pas celui que tu tape mais le '\n' enregistré dans le buffer suite à l'appuie de entrée après avoir écrit le décalage (rajoute un printf de la variable c juste avant l'appel de ta fonction afin de visualiser ceci). Ton scanf vas lire la premiere entrée du buffer se présentant donc le '\n' et non la lettre taper.
Ceci est du au fait que tes scanf ne son pas sécuriser (formaté), notamment le second.
corrige ton main en mettant ceci:
Tu aurait aussi pu ajouter un simple getchar() juste après le premier scanf afin de virer le '\n' du buffer, mais personnellement je ne trouve pas ça propre de mélanger scanf et getchar(d'autre aussi je pense). Soit tu utilise scanf et apprend à le sécuriser (formaté) soit tu t'oriente sur les fonction fgets et getchar pour récupérer le flux stdin.
Sinon pour ce qui est du codage cesar une méthode bien plus simple et plus rapide existe, en référence avec la table ascii.
Quand tu le fait par toi même avec tes 26 lettre de l'alphabet, tu applique les formule suivante:
codage: Cesar(x) = (x + 3) modulo 26
décodage: Cesar(x) = (x - 3 + 26) modulo 26
Pour pouvoir réaliser notre codage césar en c, il faut regarder la table ascii, qui va associer un nombre unique entre 0 et 127, à un caractère. En modifiant cette valeur entre 0 et 127, tu modifie donc le caractère associer à la variable qui le stocke.
exécute ce code pour visualiser ceci:
Donc pour revenir au codage cesar, tu a besoins d'une unique fonction et en repartant des formule appliquer pour un alphabet de 26 lettre que je t'ai donné plus haut, tu devrais être capable de trouver la bonne formule. Si ce n'est pas le cas dit le moi.
Évite de faire des doublons de postes merci.
Pour ton problème, il est du au fait que le caractère stocker dans la variable c n'est pas celui que tu tape mais le '\n' enregistré dans le buffer suite à l'appuie de entrée après avoir écrit le décalage (rajoute un printf de la variable c juste avant l'appel de ta fonction afin de visualiser ceci). Ton scanf vas lire la premiere entrée du buffer se présentant donc le '\n' et non la lettre taper.
Ceci est du au fait que tes scanf ne son pas sécuriser (formaté), notamment le second.
corrige ton main en mettant ceci:
int main() { int d; char c; printf("entrez le decalage : "); if(scanf("%d",&d)!=1){ printf("Input error\n"); exit (-1); } printf("entez le caractere : "); do{ if(scanf("%c",&c)!=1){ printf("Input error\n"); exit (-1); } }while(c=='\n'); printf("Le caractere code est %c\n",code(c,d)); return 0; }
Tu aurait aussi pu ajouter un simple getchar() juste après le premier scanf afin de virer le '\n' du buffer, mais personnellement je ne trouve pas ça propre de mélanger scanf et getchar(d'autre aussi je pense). Soit tu utilise scanf et apprend à le sécuriser (formaté) soit tu t'oriente sur les fonction fgets et getchar pour récupérer le flux stdin.
Sinon pour ce qui est du codage cesar une méthode bien plus simple et plus rapide existe, en référence avec la table ascii.
Quand tu le fait par toi même avec tes 26 lettre de l'alphabet, tu applique les formule suivante:
codage: Cesar(x) = (x + 3) modulo 26
décodage: Cesar(x) = (x - 3 + 26) modulo 26
Pour pouvoir réaliser notre codage césar en c, il faut regarder la table ascii, qui va associer un nombre unique entre 0 et 127, à un caractère. En modifiant cette valeur entre 0 et 127, tu modifie donc le caractère associer à la variable qui le stocke.
exécute ce code pour visualiser ceci:
int main(){ char caractere='a'; printf("caractere=%c valeur ascii=%d\n", caractere, caractere); caractere+=5; printf("caractere=%c valeur ascii=%d\n", caractere, caractere); caractere-=5; printf("caractere=%c valeur ascii=%d\n", caractere, caractere); }
Donc pour revenir au codage cesar, tu a besoins d'une unique fonction et en repartant des formule appliquer pour un alphabet de 26 lettre que je t'ai donné plus haut, tu devrais être capable de trouver la bonne formule. Si ce n'est pas le cas dit le moi.
Utilisateur anonyme
19 oct. 2015 à 07:08
19 oct. 2015 à 07:08
EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ICI Merci d'y penser dans tes prochains messages. |
19 oct. 2015 à 23:30
Pas terrible dans un main(). On préfèrera mettre plutôt : return EXIT_FAILURE;
Je ne vois pas en quoi ta solution vide le buffer clavier...
Tu aurait aussi pu ajouter un simple getchar() juste après le premier scanf afin de virer le '\n' du buffer, mais personnellement je ne trouve pas ça propre de mélanger
C'est pourtant la solution la plus propre : une boucle while sur un getchar() jusqu'à rencontrer un '\n' ou EOF.
Soit tu utilise scanf et apprend à le sécuriser (formaté) soit tu t'oriente sur les fonction fgets et getchar pour récupérer le flux stdin.
La sécurisation des entrées est une chose, mais il faut quand même vider le buffer clavier.
20 oct. 2015 à 19:48
ma solution ne vide pas le buffer mais juste le '\n' posant problème. Après c'est vrai que je n'avait pas pensé et prit en compte le fait qu'n saisie on aurais pu remplir le buffer dès le premier scanf avec un tas de donné erroné, ce qui bloquerait encore le second scanf.
Il me semblait qu'il y avait un autre moyen de vider son buffer plutot qu'une boucle sur un getchar().
En tout cas merci de cette précision.