2014-02-20 3 views
0

ОК, это то, что у меня сейчас почти право, но не будет обходить вокруг текста, и это испортится, если у ключа есть верхний регистр: -/любые подсказки или подсказки были бы потрясающими, я не понимаю size_of_the_key bcz I ' никогда не видел, что все, что я видел это STRLENVigenere Cipher. size_of_the_key

#define LMIN 97 
#define LMAX 122 
#define UMIN 65 
#define UMAX 90 
#define ALPHANUM 25 
int main(int argc, string argv[]) 
{ 
int i, j, n; 

string pt = GetString(); 
string key = argv[1]; 

for(i = 0, j = 0, n = strlen(pt); i < n; i++, j++) 
{ 

if(pt[i] >= LMIN||pt[i] == LMAX){ 

pt[i] = ((pt[i] - LMIN) + (key[j] - LMIN)) % 26; 

pt[i] += LMIN; 

printf("%c", pt[i]); 
} 

else if (pt[i] >= UMIN||pt[i] == UMAX){ 

pt[i] = ((pt[i] - UMIN) + (key[j] - UMIN)) % 26; 

pt[i] += UMIN; 

printf("%c",pt[i]); 

} else{ 
printf("%c", pt[i]); 
}   
} 
} 
+0

Похоже, что для меня нормальная переменная? Но на самом деле этот вопрос невозможно ответить, не имея полного источника (как, вероятно, у вас есть). Вам просто нужно найти источник для определения 'size_of_the_key'. –

ответ

0

Я предполагаю, что вы знакомы с тем, как Vigenère cipher работ. Когда ключевая фраза короче открытого текста, ее буквы повторяются до тех пор, пока они не образуют строку той же длины, позволяющую рассчитывать сдвиг Цезаря для каждой буквы открытого текста.

В вашем C-коде key[k % size_of_the_key] использует увеличивающуюся переменную k для доступа к каждой части ключевой фразы по очереди. modulus operator (%) гарантирует, что когда k будет превышать длину ключевой фразы, буквы будут зацикливаться столько раз, сколько необходимо.

Если вы создаете свою собственную программу, вы можете использовать простой вызов strlen(), чтобы получить длину ключевой фразы. Однако в коде, который вы отправили, ключевая фраза затем должна быть преобразована в массив значений от 0 до 25 (key[]).

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

0

Ну

  • длина текста почти всегда длиннее, чем длина ключа, который size_of_the_key. Это справедливо для большинства шифров.

  • key[k % size_of_the_key] гарантирует, что вы держите зацикливание значения на ключе, так что если текст длинный 6 и ключ длиной 4, вы будете иметь, что k % size_of_the_key имеет значения 0,1,2,3,0,1 в петле

Как комментарий,

  • k=j в каждой цепи. Вы также можете избавиться от переменной k и использовать напрямую j.

  • не использует strlen() для оценки размера ключа, так как ключ может легко содержать нулевой символ.

+0

Как я могу пройти через каждый символ вместе с текстом, если я не использую strlen? if text [i] + k [j]% 26 Я начинаю правильно его обрабатывать, но до сих пор не понимаю, как обернуть ключ вокруг текста, используя mod%, будет ли это текст% argv [1] [i], если i = 0; то имеют вид int c = argv [1] [i]; затем C++; все это в цикле for – immatryitout

+0

. Можете ли вы отредактировать свои изменения и задать другой вопрос? Этот пост становится очень грязным. – gg349

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