2017-06-21 65 views
2

我想在C中实现Vigenere的密码,但问题是,当我尝试重复使用它在数组中使用的密钥时,它会在第四个字母后中断。所以如果密钥是ABC并且明文是HELLO,它将返回HFNLO而不是HFNLP。当我查看我的代码时,它逻辑上是有道理的,但它似乎不起作用。有人可以看到这个问题吗?如何在数组中重复字符

下面是代码:

int main(int argc, string argv[]) 
{ 
    if(argc != 2) 
    { 
     printf("usage: ./vigenere k\n"); 
     return 1; 
    } 
    //asks for plain text 
    printf("plaintext: "); 
    string text = get_string(); 
    string k = argv[1]; 
    printf("ciphertext: "); 

    //checks to see if length of key is shorter than length of plaintext and duplicates it. 
    int count = 0; 
    while(strlen(k) <= strlen(text)) 
    { 
     k[strlen(k + count)] = k[count]; 
     count++; 
    } 

    //changes key to be within 0 - 25 and encrypts plaintext 
    for(int i = 0; i < strlen(text); i++) 
    { 
     if(k[i] >= 'A' && k[i] <= 'Z') 
     { 
      k[i] = k[i] - 65; 
     } 
     else if (k[i] >= 'a' && k[i] <= 'z') 
     { 
      k[i] = k[i] - 97; 
     } 

     //if statement for plaintext capital letters 
     if(text[i] >= 'A' && text[i] <= 'Z') 
     { 
      text[i] = text[i] - 64; 
      text[i] = ((text[i] + k[i]) % 26) + 64; 
     } 
     //if statement for plaintext lowercase letters 
     else if(text[i] >= 'a' && text[i] <= 'z') 
     { 
      text[i] = text[i] - 96; 
      text[i] = ((text[i] + k[i]) % 26) + 96; 
     } 
     //prints final cipher 
     printf("%c", text[i]); 
    } 
    printf("\n"); 
    return 0; 
} 
+0

什么是'k'?和'strlen(k + count)'绝对看起来很腥。 –

+0

在密钥索引上使用模数运算符,而不是此malarky。如'k [i%strlen(k)]'(为了说明的目的:做更有效的事情)。 –

回答

2

您应该使用模运算来计算偏移量的关键。

下面是修改后的版本:

#include <stdio.h> 
#include <string.h> 
#include <cs50.h> 

int main(int argc, string argv[]) { 
    if (argc != 2) { 
     printf("usage: ./vigenere k\n"); 
     return 1; 
    } 
    string k = argv[1]; 
    size_t klen = strlen(k); 
    if (klen == 0) { 
     fprintf(stderr, "vigenere: key must not be empty\n"); 
     return 1; 
    } 

    printf("plaintext: "); 
    string text = get_string(); 

    printf("ciphertext: "); 

    for (size_t i = 0; text[i] != '\0'; i++) { 
     int d = (unsigned char)k[i % klen]; 
     if (d >= 'A' && d <= 'Z') { 
      d -= 'A'; 
     } else 
     if (d >= 'a' && d <= 'z') { 
      d -= 'a'; 
     } else { 
      d = 0; 
     } 

     int c = (unsigned char)text[i]; 
     if (c >= 'A' && c <= 'Z') { 
      c = 'A' + (c - 'A' + d) % 26; 
     } else 
     if (c >= 'a' && c <= 'z') { 
      c = 'a' + (c - 'a' + d) % 26; 
     } 
     putchar(c); 
    } 
    putchar('\n'); 
    return 0; 
} 
+0

好的,非常感谢您的帮助。 –

相关问题