Vigenere cipher Принимает текст и выводит зашифрованную версию этого текста, пользователь вводит ключевое слово в командной строке и текст, для которого пользователь желает зашифровать.Если вы знакомы с шифром Ceasar, это почти то же самое, за исключением небольшого незначительного изменения, вместо того, чтобы вводить фактическое значение сдвига, вместо этого мы вводим ключевое слово, а буквы в ключевом слове представляют вместо этого значение сдвига.
#include <cs50.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int shift(char c);
int main(int argc, string argv[])
{
//checks for alphabetic characters
if (argc == 2)
{
for (int i = 0, n = strlen(argv[1]); i < n; i++)
{
if (isalpha(argv[1][i]) == false)
{
printf("Usage: ./vigenere keyword. \n");
return 1;
}
}
//promting the user for text
string text = get_string("plaintext: ");
printf("ciphertext: ");
//Intializing variables
string key = argv[1];
int l = strlen(key);
for (int j = 0, k = 0, m = strlen(text); j < m; j++)
{
if (islower(text[j]))
{
//lower cap letter enter here
printf("%c", 'a' + ( text[j] - 'a' + shift(key[k % l]) ) % 26);
k++;
}
else if (isupper(text[j]))
{
//Upper caps letter enter here
printf("%c", 'A' + ( text[j] - 'A' + shift(key[k % l]) ) % 26);
k++;
}
else
{
//The rest whatever left enter here
printf("%c", text[j]);
}
}
printf("\n");
return 0;
}
else
{
printf("Usage: ./vigenere keyword. \n");
return 1;
}
}
//This function calculates the shift value per character
int shift(char c)
{
return ( islower(c) - 'a' );
}
проблема в том, что результат не соответствует ожиданиям.Например, если ключевое слово «b», а текст «привет», вывод должен быть «ifmmp», но это не так.Я не знаю, что идет не так.