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

#include <stdio.h>
#include <ctype.h>
#include <string.h> //strlen()
char encvizh(char letter, char keylet);
int main(){
    char ch[50];
    int chl;
    char key[20];
    int kl;
    printf("Enter a key word to choose encrypting: ");
    gets(key);
    kl = strlen(key);
    printf("Enter a phrase: ");
    gets(ch);
    chl = strlen(ch);
    for (int i = 0; i < chl; i++){
        ch[i] = encvizh(ch[i], key[i%kl]);
    }
    puts(ch);
return 0;   
}
char encvizh(char letter, char keylet){

    if(isalpha(letter)){
        if(isupper(letter)){
            letter = (letter - 65 + keylet - 65)%26 + 65;
            return letter;
        }
        if(islower(letter)){
            letter = (letter - 97 + keylet - 97)%26 + 97;
            return letter;
        }
    }
    return letter;
}

Ответы (1 шт):

Автор решения: Sergey

не работает для больших букв

Для маленьких он тоже не работает. :-) Проблема у Вас в том, что когда Вы преобразуете символ маленькой буквы, то и ключ должен быть маленькой буквой. А при преобразовании большой буквы, ключ, соответственно тоже должен быть большой буквой.

Добавьте преобразование ключа:

char encvizh(char letter, char keylet){

    if(isalpha(letter)){
        if(isupper(letter)){
            keylet = toupper(keylet); // +++
            letter = (letter - 65 + keylet - 65)%26 + 65;
            return letter;
        }
        if(islower(letter)){
            keylet = tolower(keylet); // +++
            letter = (letter - 97 + keylet - 97)%26 + 97;
            return letter;
        }
    }
    return letter;
}
→ Ссылка