Шифр Цезаря C++

832
30 октября 2017, 23:29

При заходе в if (int(cstr[i]) >= 88) происходит замена последовательностью букв. В чем ошибка?

void Casesar(string str, int n) {
char *cstr = new char[str.length() + 1];
int *a = new int[str.length() + 1];
char m[] = { 'A',   'B','C','D','E',    'F',    'G',    'H',    'I',    'J',
    'K',    'L',    'M',    'N' ,'O'    ,'P'    ,'Q'    ,'R'    ,'S'    ,'T'    ,'U'    ,'V'    ,'W'    ,'X'    ,'Y'    ,'Z' };
strcpy(cstr, str.c_str());
for (int i = 0; i < str.length(); i++) {
    if (int(cstr[i]) == 32)
        continue;
    if (65 >= int(cstr[i]) <= 87) {
        a[i] = int(cstr[i]);
        a[i] += n;
    }
    if (int(cstr[i]) >= 88) {
        a[i] = int(m[i]) + n - 1;
    }
    cstr[i] = char(a[i]);
}
for (int i = 0; i < str.size(); i++) {
    cout << cstr[i];
}
delete[] cstr;
delete[] a; }
int main() {
string str;
int n = 0;
cout << "Enter string: ";
getline(cin, str);
cout << "Key: ";
cin >> n;
Casesar(str, n);
_getch();
return 0; }
Answer 1

Даже заглядывать так далеко не буду - потому что, как, по-вашему, что вы тут проверяете?

if (65 >= int(cstr[i]) <= 87) {

А на самом деле вы тут написали

if (true) {

Потому что вы сначала сравниваете

65 >= int(cstr[i])

а потом результат - true или false, т.е. 1 или 0, сравниваете с 87 - не превосходит ли оно 87? Нет, не превосходит...

Answer 2

Когда-то писал Шифр Цезаря, вот код, может поможет:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <locale.h>
#include <string.h>
// Функция проверяет является ли буква прописной
int isUpper(char letter);
// Функция проверяет является ли буква строчной
int isLower(char letter);
// Функция производит шифровку используя шифр Цезаря
char encryption(char letter, int key);
char disencryption(char letter, int key);
int main()
{
    int c;
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    char string[10];
    int key;
    printf("Введите строку (без пробелов длинною максимум 50 символов): ");
    gets(string);
    printf("Введите ключ (число сдвигов букв): ");
    scanf("%d", &key);
    int i;
    for (i = 0; i < 50; i++)
    {
        string[i] = encryption(string[i], key);
    }
    printf("\nШифрованная строка: ");
    puts(string);
    printf("\nЖелаете произвести дешифрование? Нажмите Enter\n");
    c = _getch();
    if(c==13)
    {
        for (i = 0; i < 50; i++)
    {
        string[i] = disencryption(string[i], key);
    }
    printf("\nДешифрованная строка: ");
    puts(string);
    }
    else
    exit (0);
    getch();
    return 0;
}
int isUpper(char letter)
{
    int result = 0;
    // Если символ больше либо равна 'А' и меньше либо равна 'Я', то вернуть 1(true)
    if (letter >= 'А' && letter <= 'Я')
        result = 1;
    return result;
}
int isLower(char letter)
{
    int result = 0;
    // Если символ больше либо равен 'а' и меньше либо равна 'я', то вернуть 1(true)
    if (letter >= 'а' && letter <= 'я')
        result = 1;
    return result;  
}
char encryption(char letter, int key)
{
    if (isUpper(letter))
    {
        letter += key;
        if ((int)letter > 90)
        {
            key = letter - 90;
            letter = 65 + key - 1;
        }
    }
    if (isLower(letter))
    {
        letter += key;
        if ((int)letter > 122)
        {
            key = letter - 122;
            letter = 97 + key - 1;
        }
    }
    return letter;
}
char disencryption(char letter, int key)
{
    if (isUpper(letter))
    {
        letter -= key;
        if ((int)letter > 90)
        {
            key = letter + 90;
            letter = 65 - key + 1;
        }
    }
    if (isLower(letter))
    {
        letter -= key;
        if ((int)letter > 122)
        {
            key = letter + 122;
            letter = 97 - key + 1;
        }
    }
    return letter;
}
READ ALSO
Какой алгоритм использовать для задачи?

Какой алгоритм использовать для задачи?

Я прошу только алгоритм, которым пользоваться

377
Валидация PHP AJAX.

Валидация PHP AJAX.

Всем добраУ меня такой вопрос

385