#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:
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