Всем привет, пишу код шифра Виженера,он не работает для больших букв и сбивается из-за пробела..помогите пожалуйста
#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;
}