Борьба с Виженером! (В C) недопустимые операнды для двоичного выражения ('int *' и 'int') и другие вещи

мы сейчас работаем с Цезарем, Виженером. Мне удалось закончить цезарь, но виженер работает не так хорошо. C возвращает мне: недопустимые операнды для двоичного выражения ('int *' и 'int'). Я не уверен, что именно означает программа и что не так с моим кодом. Может ли кто-нибудь помочь мне или дать мне совет? Я думаю, это потому, что я не умею считать с разными типами чисел? Я не уверен!

#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;
}

person Bo Babo    schedule 15.09.2017    source источник
comment
обычный текст кажется длиннее ключа, кажется неправильным использовать длину ключа для открытого текста. Поэтому невозможно использовать общие для них индексы.   -  person BLUEPIXY    schedule 15.09.2017
comment
Должны ли вы вместо этого спрашивать на сайте cs50; также используйте ссылку edit...   -  person Antti Haapala    schedule 15.09.2017
comment
См. это.   -  person BLUEPIXY    schedule 15.09.2017


Ответы (1)


Как упоминалось в комментариях, вы должны использовать + keycipher[index] вместо + keycipher. Это связано с тем, что keycipher — это массив, и вам нужно использовать только один из элементов массива за раз.

Кроме того, вам понадобятся 2 переменные счетчика вместо одной в той части, где вы найдете ciphertext. Это связано с тем, что вам нужно увеличивать индекс plaintext и индекс key на каждой итерации, но как только длина plaintext пересекает длину key, вам нужно будет сбросить индекс ключа. Если вы посмотрите спецификации, вы поймете, что я говорю об использовании 2 счетчиков.

person akshayk07    schedule 15.09.2017