2015-08-28 7 views
1

Я пытаюсь сделать шифр Vigenere. Моя проблема в том, что я не получаю ожидаемый результат. При запуске программы он дает этот результат: HFNLP WPTLE. Правильный вывод должен быть: HFNLP YOSND.Как отладить шифр Vigenere в C?

Я думаю, что проблема заключается в плохом использовании modulo (mod). Когда я пытаюсь обернуть вокруг ключа (ABC) переменной i, пространство ("") в plainText также обертывается, непосредственно влияя на результат обертывания. Я не делаю, чтобы получить правильный результат.

string plainText = "HELLO WORLD"; 
string keyword = "ABC"; 

for(int i = 0; i < strlen(plainText);i++) 
{ 

    int wrap = (int) strlen(keyword) % (int) strlen(plainText); 

    if(isalpha(plainText[i])) 
    { 

    int upper = 'A' + (plainText[i] + (toupper(keyword[i % wrap]))) % 26; 
    printf("%c", upper); 

    } 
+0

Подсказка: вам нужна дополнительная часть данных, чтобы сделать это. Итерация должна каким-то образом узнать, сколько мест было обнаружено до этой точки. Есть несколько способов отслеживать это. – spectras

+0

Спасибо, что помогли мне. :) –

ответ

3

Указатель ключей на неалфавитных символах не должен увеличиваться.

Пример исправления:

char *keyp = keyword; 
char ch; 
for(int i = 0; ch = plainText[i]; i++){ 
    if(isalpha(ch)){ 
     putchar('A' + (toupper(ch) - 'A' + toupper(*keyp++) - 'A') % 26); 
     if(!*keyp) 
      keyp = keyword; 
    } else 
     putchar(ch); 
} 
+0

Спасибо большое! Это действительно помогло мне. :) –