Code de chiffrement de César

#include  void caesar (char cipher[], int shift); int main () { char cipher[50]; int shift; printf("Enter text to be encrypted IN CAPITAL LETTERS ONLY: "); scanf("%s", cipher); printf("How many shifts do you prefer? 1-10 only: "); scanf("%d", &shift); caesar (cipher, shift); return 0; } void caesar (char cipher[], int shift) { int i = 0; while (cipher[i] != '\0') { if ((cipher[i] += shift) >= 65 && (cipher[i] += shift) <= 90) { cipher[i] += (shift); } else { cipher[i] += (shift - 25); } i++; } printf("%s", cipher); } 

Je commence à obtenir des sorties chiffrées, mais je crains que mes déclarations ne soient erronées.

Par exemple:

  • Entrée: ABCD, 1 quart
  • Sortie: DEFG <= qui correspond en fait à 3 équipes.

Changement

 if ((cipher[i] += shift) >= 65 && (cipher[i] += shift) <= 90) ... 

à

 if ((cipher[i] + shift) >= 65 && (cipher[i] + shift) <= 90) ... 

puisque += modifie le cipher[i] .

(Je suis arrivé ici via http://codereview.stackexchange.com , donc je porte toujours un chapeau de révision de code).

Avec un code manipulant des lettres, je trouve plus facile à comprendre s’il utilise des lettres réelles dans la source plutôt que des codes numériques. Je recommande donc de changer

  cipher[i] += (shift - 25); 

à quelque chose comme

  cipher[i] += (shift - ('Z' - 'A')); 

La plupart des gens qui utilisent les chiffres de César ne convertissent que les lettres et ne modifient pas la ponctuation, les chiffres, les espaces, etc. Vous pourriez envisager d’inclure la bibliothèque de caractères standard

 #include  

et en utilisant les fonctions isalpha (), islower (), isupper () – en particulier, changer

 if ((cipher[i]) >= 'A' && (cipher[i]) <= 'Z') { 

à quelque chose comme

 if (isupper(cipher[i])) { 

.

 void caesar (char cipher[], int shift) { int i = 0; while (cipher[i] != '\0') { if (cipher[i] >= 'A' && cipher[i]<='Z') { char newletter = cipher[i] - 'A'; newletter += shift; newletter = newletter % 26; cipher[i] = newletter + 'A'; } i++; } printf("%s", cipher); } 

Cela ignorera tout ce qui n'est pas une lettre majuscule.

Si les lettres avaient des codes de 0 à 25, il serait très facile de faire un décalage parce que nous pourrions enregistrer une condition en utilisant juste un rest de 26. Ce que j’ai fait, je soustrais "A", de sorte que la lettre A soit 0, puis j'ajoute le décalage et calcule le rest, de sorte que si vous ajoutez 1 à un "Z", vous obtiendrez à nouveau un "A" et ainsi de suite. Et à la fin, j’ai dû append «A» à nouveau, car en ASCII, le «A» n’est pas vraiment 0.

essayez de remplacer

 if ((cipher[i] += shift) >= 65 && (cipher[i] += shift) <= 90) { cipher[i] += (shift); } else { cipher[i] += (shift - 25); } 

avec

 if ((cipher[i] += shift) >= 65 && (cipher[i] = shift) <= 90) { // do nothing } else { cipher[i] = 'A' + ('Z' - cipher[i]) -1; } 

L'utilisation de "+ =" modifiera la valeur à chaque évaluation. cela a été évalué 3 fois dans votre code, c'est pourquoi il donne 3 décalages!

Petite version de travail, pas de plage de décalage sauf les valeurs négatives:

 #include  void caesar (char cipher[], int shift); int main () { char cipher[50]; int shift; printf("Plaintext (Caps only): "); scanf("%s", cipher); printf("Shift: "); scanf("%d", &shift); caesar (cipher, shift); return 0; } void caesar (char cipher[], int shift) { for(int i=0; cipher[i] != '\0'; i++) cipher[i] = 65 + (cipher[i]-65+shift)%26; printf("Cipher text: %s\n", cipher); } 

J’ai modifié LtWorf pour correspondre à mon projet actuel.

plage de décalage: -9 ~ +9

 void caesar(char cipher[], int shift) { int i = 0; while (cipher[i] != '\0') { if (cipher[i] >= 'A' && cipher[i]<='Z') { char newletter = cipher[i] - 'A' + 26; newletter += shift; newletter = newletter % 26; cipher[i] = newletter + 'A'; } else if (cipher[i] >= '0' && cipher[i]<='9') { char newletter = cipher[i] - '0' + 10; newletter += shift; newletter = newletter % 10; cipher[i] = newletter + '0'; } i++; } printf("%s\n", cipher); } 

Caesar Cipher Code pour C ++

 #include #include using namespace std; char cipher(char c, int k) { if(isupper(c)) return char( 'A' + (c - 'A' + k ) % 26); else if(islower(c)) return char( 'a' + (c - 'a' + k ) % 26); else return c; } int main() { int k; ssortingng str; cin>>str>>k; int l = str.size(); for(int i=0; i