2016-02-24 2 views
3
string text = GetString(); 

//enters length of argv string into q 
//converts string argv[1] into string key 

string key = argv[1]; 
int klen = strlen(key); 
int kposition = 0; 


    //loop through the characters in array "text" 
    for (int tposition = 0, n = strlen(text); tposition < n; tposition ++) 
    { 
     if isupper(key[kposition]) 
     { 
      key[kposition] = ((key[kposition] - 'A') % klen) + 'A'; 
     } 
     else if islower(key[kposition]) 
     { 
      key[kposition] = ((key[kposition] - 'a') % klen) + 'a'; 
     } 

     //determine if character is alphabetical 
     if (isalpha(text[tposition])) 
     { 

      //encrypt upper case characters 
      if (isupper(text[tposition])) 
      { 
       //modulo magic to loop to beginning of alphabet after 'Z' 
       text[tposition] = (((text[tposition] - 'A') + key[kposition]) % 26) + 'A'; 
       printf("%c", text[tposition]); 
      }   
       //encrypt lower case characters 
      else 
      { 
       //modulo magic to loop to beginning of alphabet after 'z' 
       text[tposition] = (((text[tposition] - 'a') + key[kposition]) % 26) + 'a'; 
       printf("%c", text[tposition]); 
      } 
     } 
     //if the input isn't alphabetical, then just print the input (spaces) 
     else 
     { 
      printf("%c", text[tposition]); 
     } 
    kposition ++; 

    }  
    printf("\n"); 
    return 0; 

}инкремента и обертывание ключ

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

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

Например, когда я бегу: vigenere.c -bacon

и введите: «Встретимся в парке», я получаю: «Gxzq г-н п КИР Frea», вместо правильного ответа , который: «Negh zf av huf pcfx».

Таким образом, верхний/нижний регистр работает, а пробелы работают. Проблема заключается в приращении ключа [kposition]. Часть проблемы заключается в том, что я не интуитивно подействую по модулю очень хорошо, поэтому мне не ясно, что именно делает арифметика по модулю (кроме того, что она дает остаток от двух чисел).

Как я могу лучше расположить свой ключ [kposition] инкремент?

ответ

0

Этот внутренний цикл, увеличивающий j, кажется совершенно неуместным и ненужным для меня.

То, что вы делаете, сначала выглядит довольно хорошо: определите два индекса для итерации, один над открытым текстом (i) и один над ключом (j).

Тогда вам просто нужно перебрать текст. Вы шифруете символ в текстовой позиции i с символом в ключевой позиции j. Затем вы увеличиваете оба показателя итерации на единицу, сохраняя индекс ключа в диапазоне (например, используя modulo).

Итак, в основном вам просто нужно избавиться от этого внутреннего цикла цикла и добавить логику для увеличения j с внешним циклом.

Относительно вашего кода: Желательно разбить его еще немного: Напишите функцию для шифрования одного символа и использования его в вашем цикле. Используйте лучшие имена для своих переменных. i и j - не описательны.

0

Для отладки это самостоятельно, распечатайте значения key[kposition]

Вам нужно ограничить kposition

kposition = (kposition+1)%klen; 

и только изменить его для алфавитных символов.

Есть текущий ключ как темп, не повторно добавить 'A', который не совсем делать по модулю 26 правильно

key[kposition] = ....; 

Переход к

Tkey = ((key[kposition] - 'a')); 

или

Tkey = ((key[kposition] - 'A')); 

Вы не модифицируете klen и не обновляете ключ.Изменить другую клавишу [kposition] на Tkey

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

int main(int argc, char ** argv) 
{ 
    char text[] = "Meet me at the park"; 
    char * key = "bacon"; 

//enters length of argv string into q 
//converts string argv[1] into string key 

//string key = argv[1]; 
int klen = strlen(key); 
int kposition = 0; 


//loop through the characters in array "text" 
for (int tposition = 0, n = strlen(text); tposition < n; tposition++) 
{ 
    unsigned Tkey = 0; 
    if(isupper(key[kposition])) 
    { 
     Tkey = ((key[kposition] - 'A')); 
    } 
    else if(islower(key[kposition])) 
    { 
     Tkey = ((key[kposition] - 'a')); 
    } 

    //determine if character is alphabetical 
    if (isalpha(text[tposition])) 
    { 

     //encrypt upper case characters 
     if (isupper(text[tposition])) 
     { 
      //modulo magic to loop to beginning of alphabet after 'Z' 
      text[tposition] = (((text[tposition] - 'A') + Tkey) % 26) + 'A'; 
      kposition = (kposition + 1) % klen; 

      printf("%c", text[tposition]); 
     } 
     //encrypt lower case characters 
     else 
     { 
      //modulo magic to loop to beginning of alphabet after 'z' 
      text[tposition] = (((text[tposition] - 'a') + Tkey) % 26) + 'a'; 
      kposition = (kposition + 1) % klen; 
      printf("%c", text[tposition]); 
     } 
    } 
    //if the input isn't alphabetical, then just print the input (spaces) 
    else 
    { 
     printf("%c", text[tposition]); 
    } 

} 
printf("\n"); 
return 0; 
} 
+0

Благодарим за указателей, mksteve! разбивка переменных tkey и kposition сделала вещи намного яснее! – DavidH

Смежные вопросы