Reputation: 1
I have tried to create an implementation of a vigenere cipher, but have come across a hurde in the form of the program not working properly when given spaces in the input. (Assume keyword bacon) With Spaces
Input
Meet me
Correct Output
Negh zf
Actual Output
Negh Ne
Without Spaces
Input
Meetme
Ouput
Neghzf
So clearly the program is working for strings without the spaces. Anywhere here is the code and thanks in advance for help.
#include <string.h>
#include <stdio.h>
#include <ctype.h>
char encrypt(int key, char a);
int hash(char a);
int main(int argc, string argv[])
{
if (argc != 2)
{
printf("You need a keyword!");
return 1;
}
string keyword = argv[1];
for (int j = 0; j != strlen(keyword); ++j)
{
if (!isalpha(keyword[j]))
{
printf ("The keyword needs to be all words!");
return 1;
}
}
string text = GetString();
for (int i = 0, j = 0; i != strlen(text); ++i, ++j)
{
if (j == strlen(keyword))
{
j = 0;
}
int key = 0;
if (isupper(keyword[j]))
{
key = keyword[j] - 'A';
text[i] = encrypt(key, text[i]);
}
else if (islower(keyword[j]))
{
key = keyword[j] - 'a';
text[i] = encrypt(key, text[i]);
}
else if (isspace(text[i]))
{
j = j - 1;
}
}
printf ("%s\n", text);
}
char encrypt(int key, char a)
{
if (isalpha(a))
{
int total = (int) a + key;
if (isupper(a))
{
while (total > 90)
{
total = total - 26;
}
}
else if (islower(a))
{
while (total > 122)
{
total = total - 26;
}
}
return (char) total;
}
else
{
return a;
}
}
Upvotes: 0
Views: 50
Reputation: 42054
the problem is inside your for loop. Try to correct it in the following way (you will understand easily the mistake):
for (int i = 0, j = 0; i != strlen(text); ++i, ++j)
{
if (j == strlen(keyword))
{
j = 0;
}
// the following check mmust be done here
if (isspace(text[i])) {
j = j - 1;
}
int key = 0;
if (isupper(keyword[j]))
{
key = keyword[j] - 'A';
text[i] = encrypt(key, text[i]);
}
else if (islower(keyword[j]))
{
key = keyword[j] - 'a';
text[i] = encrypt(key, text[i]);
}
}
Upvotes: 1
Reputation: 1877
It looks like you are reading your words from command line arguments; however, command line arguments are typically separated by whitespace. Your program doesn't know that those spaces are supposed to be part of the input.
You need to change the way you are reading input.
Upvotes: 0