2015-03-28 4 views
-4

Я не могу понять, почему эта вещь не скрещивается правильно. Я прочитал несколько других сообщений об этом шифре, и насколько я могу судить, я использую тот же алгоритм, что и они ...Vigenere Cipher Black Hawk Down

Области, закомментированные, являются тестами, которые я пытался проверить, чтобы все прошло правильно. Я считаю, что все прошло правильно, а затем не удалось выполнить алгоритм.

#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

Что именно ваш вопрос? Каков ваш вклад, что вы ожидаете от вывода? – nvoigt

+0

вывод для: Познакомьтесь со мной в парке в одиннадцать часов утра: Negh zf av huf pcfx bt gzrwep oz Вам нужно будет посмотреть, что такое шифр vigenere, чтобы понять, что он сдвигает буквы. GetString() запрашивает использование ввода, возвращает строку ввода пользователей. Да, я могу использовать strlen для строки. – Krill

+0

Программа запускает его, просто не скрещивается правильно – Krill

ответ

1

Я думаю, что ваш расчет не так:

У вас

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

путем проверки C operator precedence table мы замечаем, что % вычисляется перед - или +, а это означает, что ваш код на самом деле означает:

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

Где вы хотели:

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

Вывод: вам нужно поставить больше Parenthèse, чтобы указать, в каком порядке, какие оценить ваше выражение.


Кроме того, вы взяли номер письма для символа текста, но не для ключа!

Правильное выражение

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

Demonstration in javascript

+0

Спасибо. Я изменил круглые скобки, но я все равно получаю тот же результат, что и раньше Ключ: бекон Сообщение: Встретить Зашифровано: Gxza спасибо. – Krill

+0

Может быть, ключ должен быть int, а не строкой hmmmmmmmm ....... – Krill

+0

Я забыл, но кажется, что ни вы, ни я не занимаем место на счету – dvhh