Vigenere Cipher ne fonctionne que jusqu’à traiter avec un espace (“”) en C – pourquoi?

#include  #include  #include  #include  #include  int main(int argc, ssortingng argv[]) { ssortingng k = argv[1]; ssortingng s = GetSsortingng(); int l = strlen(k); for(int i = 0, n = strlen(s); i = 65 && s[i] = 97 && s[i] <= 122) { int i2 = ((s[i]-97) + (k[i%l]-97)) % 26; printf("%c", i2+97); } else { printf("%c", s[i]); } } printf("\n"); return 0; } 

J’ai supprimé autant de parties que possible afin de rendre le code plus pertinent pour la question. Fondamentalement, pourquoi ce code fonctionne-t-il lorsque “s” ne contient aucun espace (“”) et pas lorsque “s” consiste en un espace (“”)?

Comme la plupart d’entre vous le savent peut-être, l’argument entré dans argv [1] est le “mot-clé” du chiffre. L’utilisateur entre ensuite un “texte brut” pour chiffrer (s). Cela fonctionne lorsque j’essaye avec différents mots ou phrases s’il n’inclut aucun espace, “”. Je ne comprends tout simplement pas la logique derrière tout ça. Pourquoi le cycle est-il interrompu si s[i] n’est pas l’une des deux premières conditions – j’aurais pensé que la condition “sinon” fonctionnerait.

J’apprécierais vraiment que quelqu’un puisse éclaircir cette question – merci d’avance!

ps: Je sais qu’il y a quelques bibliothèques supplémentaires en haut et que l’entrée utilisateur dans argv[1] n’est pas vérifiée via isalpha() . Je veux juste mieux comprendre le processus du cycle pour le moment, j’ai préparé ces vérifications dans un autre fichier.

    Voici le code qui implémente le commentaire ‘compteurs séparés pour chaîne et clé’ que j’ai fait. Il utilise également les codes de lettres 'a' et 'A' (et évite d’avoir à utiliser 'z' ou 'Z' ) au lieu d’utiliser des chiffres. Cela suppose que vous traitez avec un ensemble de codes à un octet (pas UTF-8, sauf si vous travaillez dans la plage ASCII) où les lettres minuscules et majuscules sont dans une plage contiguë t fonctionnent de manière fiable avec EBCDIC, mais avec la plupart des autres jeux de codes) et ignore également les caractères accentués. (Il faudrait faire setlocale("") pour obtenir des interprétations spécifiques aux parameters régionaux pour déterminer quels caractères sont des lettres.)

     #include  #include  #include  #include  int main(int argc, ssortingng argv[]) { if (argc != 2) { fprintf(stderr, "Usage: %s key\n", argv[0]); return 1; } ssortingng k = argv[1]; int l = strlen(k); for (int i = 0; i < l; i++) { int c = k[i]; if (!isalpha(c)) { fprintf(stderr, "%s: non-alpha character %c in key string\n", argv[0], c); return 1; } k[i] = tolower(c); } printf("Enter a string to be encrypted:\n"); string s = GetString(); int n = strlen(s); for (int i = 0, j = 0; i < n; i++) { int c = (unsigned char)s[i]; if (isupper(c)) c = ((c - 'A') + (k[j++ % l] - 'a')) % 26 + 'A'; else if (islower(c)) c = ((c - 'a') + (k[j++ % l] - 'a')) % 26 + 'a'; putchar(c); } putchar('\n'); return 0; } 

    Voici un exemple d’exécution qui montre la faiblesse de l’utilisation de «a» dans l’une des lettres de la clé de ce chiffrement de Vigenere:

     ./vc caesArandAbrAcaDabRa Enter a ssortingng to be encrypted: It is reported that Caesar said "Veni, vidi, vici" when he conquered Britain. Kt mk rvpbutfu tjaw Cbvscr wsiu "Vrqi, wzdk, vlcj" nhgn lw cfndxesvd Drltbzn.