При заходе в 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; }
Даже заглядывать так далеко не буду - потому что, как, по-вашему, что вы тут проверяете?
if (65 >= int(cstr[i]) <= 87) {
А на самом деле вы тут написали
if (true) {
Потому что вы сначала сравниваете
65 >= int(cstr[i])
а потом результат - true или false, т.е. 1 или 0, сравниваете с 87 - не превосходит ли оно 87? Нет, не превосходит...
Когда-то писал Шифр Цезаря, вот код, может поможет:
#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;
}
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники