Untitled
unknown
c_cpp
a year ago
2.1 kB
10
Indexable
// including header files
#include <cs50.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
// constants
const int ALPHABET = 26;
// prototypes
bool check_valid_keys(string s);
int main(int argc, string argv[])
{
// checking for command line argument exceptions
if (argc != 2)
{
// checking the number of CL arguments
printf("Usage: ./substitution key\n");
return 1;
}
else if (strlen(argv[1]) != ALPHABET)
{
// checking if the length of the key is exactly 26
printf("Key must contains %i letter\n", ALPHABET);
return 1;
}
else if (!check_valid_keys(argv[1]))
{
// checking if the key of 26 lenghts contains all the alphabet
printf("Key must contains %i distinct letter\n", ALPHABET);
return 1;
}
// taking user input and getting key
string text = get_string("plaintext: ");
string key = argv[1];
// transforming key to all upercase
for (int i = 0; i < ALPHABET; i++)
{
key[i] = toupper(key[i]);
}
// encrypting text
for (int i = 0, n = strlen(text); i < n; i++)
{
if (islower(text[i]))
{
text[i] = tolower(key[(int) text[i] - (int) 'a']);
}
else if (isupper(text[i]))
{
text[i] = key[(int) text[i] - (int) 'A'];
}
}
// printing encrypted text
printf("ciphertext: %s\n", text);
return 0;
}
bool check_valid_keys(string s)
{
// creating an array of boolean consisting of 26 false value
bool check[ALPHABET];
for (int i = 0; i < ALPHABET; i++)
{
check[i] = false;
}
// checking each alphabet
for (int i = 0; i < ALPHABET; i++)
{
s[i] = toupper(s[i]);
if (s[i] >= 'A' && s[i] <= 'Z')
{
check[s[i] - 'A'] = true;
}
}
for (int i = 0; i < ALPHABET; i++)
{
if (!check[i])
{
return false;
}
}
return true;
}
Editor is loading...
Leave a Comment