2017-06-21 3 views
2

J'essaye d'implémenter le Chiffre de Vigenere en C mais le problème est que quand j'essaye de répéter la clef utilisée dans le tableau il est dedans, il casse après la 4ème lettre. Donc, si la clé est ABC et que le texte en clair est HELLO, il renvoie HFNLO au lieu de HFNLP. Quand je regarde mon code, ça a du sens, mais ça ne marche pas. Quelqu'un peut-il voir le problème?Comment répéter les caractères dans le tableau

Voici le code:

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

Ce qui est 'K'? et 'strlen (k + count)' semble définitivement louche. –

+0

Utilisez l'opérateur de module sur l'index de clé, au lieu de ce malarky. Tels que 'k [i% strlen (k)]' (à des fins d'illustration: faire quelque chose de plus efficace). –

Répondre

2

Vous devez utiliser l'opérateur modulo pour calculer le décalage dans la clé.

est ici une version modifiée:

#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

Ok, merci beaucoup pour l'aide. –