В настоящее время я работаю над шифром Виженера в CS50 с использованием языка C. Требуется создать программу, которая шифрует некоторый открытый текст на основе ключевого слова (оба из которых вводятся пользователем). Он будет шифроваться на основе шифра Виженера. Мне сложно описать словами, что такое шифр Виженера, поэтому вот пример из спецификации CS50:
Если бы сам Виженер хотел передать кому-то ПРИВЕТ конфиденциально, используя ключевое слово, скажем, ABC, он бы зашифровал H ключом 0 (т. Е. A), E с ключом 1 (т. Е. B) и первый L с ключом 2 (то есть C), в этот момент у него не будет букв в ключевом слове, и поэтому он повторно использовал (часть) его, чтобы зашифровать второй L с ключом 0 ( то есть, A) снова, и O с ключом 1 (то есть B) снова. И поэтому он написал HELLO как HFNLP.
Ключевое слово должно быть строкой из всех букв алфавита и должно быть указано в качестве второго аргумента командной строки, то есть argv [1] в моем приведенном ниже коде. Проблема, с которой я столкнулся, заключается в том, что я не могу заставить программу отклонять ключ, если он не алфавитный, и продолжать, если он полностью алфавитный. Я пробовал сделать это так (см. Код ниже), и он не возвращает сообщение об ошибке printf, если я включаю число в argv [1]. Пожалуйста, может кто-нибудь посоветовать, что не так? Приносим извинения, если формат не очень хорош ...
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
// declare command line argument variables
int main(int argc, string argv[])
{
string k = argv[1];
//return error if there aren't two command line arguments
if (argc != 2)
{
printf("Usage: ./vigenere k\n");
return 1;
}
//make sure key is all alphabetical
for (int i = 0; i < strlen(k); i++)
{
if(isalpha(k[i]))
{
return 0;
}
else
{
return 1;
printf("Please ensure all characters are alphabetical.\n");
}
}
}
Я также пробовал это, а не то, что находится внутри цикла for выше, и это не сработало:
if(!isalpha(k[i]))
{
return 1;
printf("Please ensure all characters are alphabetical.\n");
}