Struggling with Vigenere! (In C) invalid operands to binary expression ('int *' and 'int') and other things

148 Views Asked by At

we are now working with caesar, vigenere. I mannaged to finish caesar but vigenere is not working as good. C gives me back: invalid operands to binary expression ('int *' and 'int'). I'm not sure what the program means exactly and what is wrong with my code. Can somebody help me out or give me advice? I think it's because I can not count with the different types of numbers? I'm not sure!

#include <cs50.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, string argv[])
{
if (argc != 2)
{
    printf("You have to input a key, try again!\n");
    return 1;
}

string key = argv[1];
int keylength = strlen(key);

for (int i = 0; i < keylength; i++)
{
    if (!isalpha(argv[1][i]))
    {
        printf("Please insert letters, nothing else\n");
        return 1;
    }
}

printf("plaintext: ");
string plain = get_string();


int keycipher[keylength];
for(int i = 0; i < keylength; i++)
{
    keycipher[i] = toupper(key[i]) - 65;
}

if (plain != 0)
{
    printf("ciphertext: ");
    int i;
    for (i = 0, keylength = strlen(key); i < keylength; i++)
    {
        if (isupper(plain[i]))
        {
            printf("%c", (plain[i] - 65 + keycipher) % 26);
        }
        else if (islower(plain[i]))
        {
            printf("%c", (plain[i] - 97 + keycipher) % 26);
        }
        else if (plain[i] == ' ')
        {
            printf(" ");
        }
        else
        {
            printf("%c", plain[i]);
        }
    }
}
return 0;
}
1

There are 1 best solutions below

0
On

As mentioned in the comments, you have to use + keycipher[index] instead of + keycipher. This is because keycipher is an array and you need to use only one of the elements of the array at a time.

Further, you will need 2 counter variables instead of just one in the part where you find the ciphertext. This is because you need to increment the plaintext index and the key index in every iteration, but once the plaintext length crosses the key length, you will need to reset the key index. If you check the specifications, you will understand what I am saying about using 2 counters.