2015-03-28 1 views
-4

Je n'arrive pas à comprendre pourquoi cette chose ne se bouscule pas correctement. J'ai lu d'autres messages sur ce chiffre et autant que je sache, j'utilise exactement le même algorithme ...Chiffre Vigenere Black Hawk Down

Les zones commentées sont des tests que j'ai essayés de m'assurer que tout se passait correctement. Je crois que tout passe correctement, puis échoue dans l'algorithme.

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

string get_message(void); 
string scramble(string key, string message); 

int main(int argc, string argv[]) 
{ 
    if(argc == 2) 
    { 
     string key; 
     string message; 

     key = argv[1]; 
     //printf("KEY: %s<<",key); 
     message = get_message(); 
     scramble(key, message); 
    } 
    else 
    { 
     printf("Please enter 2 arguments.\n"); 
     return 1; 
    } 
} 

string get_message(void) 
{ 
    string message = ""; 
    do 
    { 
     message = GetString(); 
    } 
    while(strlen(message) < 1); 
    return message; 
} 

string scramble(string key,string message) 
{  
    for(int i = 0, len = strlen(message), key_len = strlen(key); i < len; i++) 
    { 
     int letter = message[i]; 
     //int Tkey = atoi(key[i % key_len]); 
     //printf("KEY: %d<<\n",Tkey); 

     if(islower(letter)) 
     { 
      //printf("KEY(%d)",(key[i % key_len]-97)); 
      letter = (((letter - 97) + (key[i % key_len])) % 26 + 97); 
      //printf("(%d)",(letter - 97) + (key[i % key_len])%26); 
      printf("%c",letter); 
     }  
     else if(isupper(letter)) 
     { 
      //printf("(%d)", key[i]); 
      //printf("(%c)",letter); WE HAVE CORRECT LETTER 
      letter = (((letter - 65) + (key[i % key_len])) % 26 + 65); 
      printf("%c",letter); 
     } 
    } 
    printf("\n"); 
    return 0; 
} 
+3

Quelle est exactement votre question? Quelle est votre contribution, qu'attendez-vous comme sortie? – nvoigt

+0

sortie pour: Rencontrez-moi au parc à onze heures du matin devrait être: Negh zf av huf pcfx bt gzrwep oz Vous devez rechercher ce qu'est un chiffre de vigenere pour le comprendre il déplace des lettres. GetString() demande l'utilisation d'entrée renvoie une chaîne d'utilisateurs entrée. Oui, je peux utiliser strlen sur une chaîne. – Krill

+0

Le programme s'exécute il ne brouille pas correctement – Krill

Répondre

1

Je pense que votre calcul est erroné:

Vous avez actuellement

encryptedLetter = (letter - firstLetterOffset) + key[position % keyLength] % 26 + firstLetterOffset 

par chèque le C operator precedence table on remarque que % est évaluée avant - ou +, ce qui signifie que votre code signifie réellement:

encryptedLetter = (letter - firstLetterOffset) + (key[position % keyLength] % 26) + firstLetterOffset 

Où que vous vouliez:

encryptedLetter = ((letter - firstLetterOffset) + key[position % keyLength]) % 26 + firstLetterOffset 

Conclusion: vous avez besoin de mettre plus parenthese pour indiquer où vous commandez pour évaluer votre expression.


En outre, vous avez pris le numéro de lettre pour le caractère de texte, mais pas pour la clé!

expression correcte

encryptedLetter = ((letter - firstLetterOffset) + key[position % keyLength] - firstLetterOffset) % 26 + firstLetterOffset 

Demonstration in javascript

+0

Merci. J'ai changé les parenthèses mais j'obtiens toujours la même sortie qu'avant Clé: bacon Message: Rencontrez Crypté: Gxza merci. – Krill

+0

Peut-être la clé doit être un int et pas une chaîne hmmmmmmmm ....... – Krill

+0

J'ai oublié, mais il semble que ni vous ni moi prenons de l'espace dans le compte – dvhh