Пишу шифр Виженера на си, столкнулся с проблемой неправильного полученного результата, возможно ошибка в самих подсчетах, помогите пожалуйста

Рейтинг: 0Ответов: 1Опубликовано: 26.02.2023

Результат который должен получится: "JSXAI PSINR!" Результат который выходит: "JEDGU MLZLV!" результат перевести в Uppercase

char* vigenere_encrypt(const char* key, const char* text)
{
    int length = strlen(text);
    int length_key = strlen(key);
    char new_key[length_key];
    int i = 0;
    int j = 0;
    char* result = calloc(length + 1, sizeof(char));
    for(i = 0, j = 0; i < length; ++i, ++j)
    {
        if (j == length_key)
        {
            j = 0;
        }
        new_key[i] = key[j];
    }
    for (i = 0; i < length; ++i)
    {
        if (isalpha(text[i]))
        {
            result[i] = toupper(text[i] + newKey[i % length_key]) % 26 + 'A';
        }
        else
        {
            result[i] = text[i];
        }    
    }
    /* на выходе получается JEDGU MLZLV! */
    return result;  
}

int main(void)
{
    char* encrypted;
    encrypted = vigenere_encrypt("CoMPuTeR", "Hello world!");
    printf("%s\n", encrypted);
    /* "JSXAI PSINR!" - ожидаемый результат */
    return 0;
}

Ответы

▲ 0

У тебя ASCII-коды считаются неправильно. Замени
result[i] = toupper(text[i] + newKey[i % length_key]) % 26 + 'A';
на
result[i] = (toupper(text[i]) + toupper(new_key[i % length_key])) % 26 + 'A';
И ещё - нельзя возвращать из функции указатель на временную переменную, в твоём случае это char* result!