saaj1000
saaj1000

Reputation: 1

Program not encrypting properly with spaces

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

Answers (2)

gaetanoM
gaetanoM

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

clay
clay

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

Related Questions