Я работал над cs50 pset2, и я думал, что у меня есть шифр vigenere после работы над ним в течение нескольких дней. Этот код предназначен для использования алфавитного аргумента (argv []), заданного пользователем, и использовать его как ключ для склеивания фразы, заданной пользователем (строкой) по ее числу в алфавитном индексе. Например, если вы даете аргумент «abc» и строку «cat», тогда вывод должен быть «cbv» (перемещение 0, b перемещение 1, c перемещение 2). Аргумент также должен быть обернут вокруг, так что если строка дольше аргумент будет перенесен на первый символ и будет продолжаться до тех пор, пока строка не закончится.Vigenere Cipher. Выход кода
Это то, что у меня есть для кода:
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(int argc, string argv[])
{
if(argc != 2)
{
printf("Try again\n");
return 1;
}
string k = (argv[1]);
int klen = strlen(k);
for(int x = 0; x < klen; x++)
{
if(isalpha(k[x]))
{
if(isupper(k[x]))
{
k[x] = tolower(k[x]);
}
k[x] -= 'a';
}
else
{
printf("Try again\n");
return 1;
}
}
string code = GetString();
int clen = strlen(code);
for(int a = 0, b = 0; a < clen; a++)
{
if(isalpha(code[a]))
{
int key = k[b%klen];
if(isupper(code[a]))
{
printf("%c", (((code[a] - 'A') + key)%26) + 'A');
b++;
}
else
{
printf("%c", (((code[a] - 'a') + key)%26) + 'a');
b++;
}
}
else
{
printf("%c", code[a]);
}
}
printf("\n");
}
код, кажется, работает на длине ключа +1. Например, я входной аргумент «AAAA»
Затем введите строку «» BBBBB и получить «BBBBB» правильно.
Однако, если вход такой же «аааа»
Затем ввести строку длиннее ключ +1 «» BBBBBBB я получаю «bbbbbNN»
Я считаю, что у меня есть проблемы с моим заказом операций, но попытались перемещать круглые скобки вокруг безрезультатно. Я надеялся, что кто-то может указать мне в правильном направлении, почему мой ключ не обертывается должным образом.
Я не могу воспроизвести это для ввода '' aaaa' и bbbbbbb', хотя я не использую любой 'string' типа, просто назначая' символ * к = ARGV [ 1]; 'и' char * code = argv [2]; 'остальное, как вы писали. Я предлагаю вам распечатать значение 'int klen = strlen (k);' –
Я думаю, что ваш третий printf должен быть 'printf ("% c ", (((код [a] - 'a') + (k [b% klen] - 'A'))% 26) + 'a'); '. –
Боб, спасибо за это. Это определенно было частью проблемы. Я обновил свой код, но теперь вместо 'bbbbbNN' я получаю' bbbbbhh'. Кажется, у меня все еще возникают проблемы с переносом ключа вокруг кода. –