Vigenere Cipher只能处理C中的空格(“”) – 为什么?

#include  #include  #include  #include  #include  int main(int argc, string argv[]) { string k = argv[1]; string s = GetString(); 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; } 

我已经删除了尽可能多的部分,以使代码与问题更相关。 基本上为什么当“s”中没有任何空格(“”)时这个代码工作,而当“s”由空格(“”)组成时,这个代码不起作用?

大多数人可能知道这个想法是在argv [1]输入的参数是密码的“关键字”。 然后,用户将“纯文本”输入到密码。 当我尝试使用各种单词或句子时,如果它不包含任何空格,它就会起作用。“ 我只是不明白这背后的逻辑。 如果s[i]不是前两个条件之一,为什么循环会中断 – 我会认为“else”条件会起作用。

如果有人能够对此有所了解,我将非常感激 – 非常感谢!

ps:我知道顶部有一些额外的库,并且argv[1]的用户输入未通过isalpha()validation。 我现在只想更好地理解循环过程,我已经准备好了另一个文件中的那些检查。

这是实现我所做的“字符串和键的单独计数器”注释的代码。 它还使用字母代码'a''A' (并避免使用'z''Z' )而不是使用数字。 它确实假设您正在处理单字节代码集(不是UTF-8,除非您在ASCII范围内工作),其中小写和大写字母都在一个连续的范围内(所以它赢了’使用EBCDIC可靠地工作,但与大多数其他代码集一起工作),它也忽略重音字符。 (必须使用setlocale("")来获取哪些字符是字母的特定于语言环境的解释。)

 #include  #include  #include  #include  int main(int argc, string argv[]) { if (argc != 2) { fprintf(stderr, "Usage: %s key\n", argv[0]); return 1; } string 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; } 

这是一个示例运行,演示了使用'a'作为此Vigenere密码的密钥中的一个字母的弱点:

 ./vc caesArandAbrAcaDabRa Enter a string 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.