Ваш код правильно обрабатывает заглавные и строчные буквы в текстовом формате, но не правильно обрабатывает разные буквы регистра в ключевом слове.Когда вы обрабатываете заглавную текстовую букву, вы вычитаете 65
из буквы ключевого слова, даже если это не прописная буква.
Вы должны просто преобразовать все буквы ключевого слова в общий регистр и вычесть соответствующийпервая буква, чтобы получить сумму, которую нужно увеличить.
Также нет необходимости проверять islower()
- если она не прописная, то должна быть строчная.Так что просто используйте else
.
if (isupper(plaintext[i]))
{
alpha = plaintext[i]-'A';
key = toupper(argv[1][j])-'A';
cipher = (key+alpha)%26;
a = (char) cipher+'A';
printf("%c",a);
j=(j+1)%len;
}
else
{
alpha = plaintext[i]-'a';
key = toupper(argv[1][j])-'A';
cipher = (key+alpha)%26;
a = (char) cipher+'a';
printf("%c",a);
j=(j+1)%len;
}
Чтобы исправить ошибку сегментации из-за отсутствия argv[1]
, переместите цикл, который проверяет, что ключевое слово является буквенным в блоке if (argc == 2)
.Затем вы также можете использовать переменную len
вместо повторения strlen(argv[1])
в цикле.