Мой код должен зашифровать текст по ключевому слову. Суть шифра: Вы даете исходный текст и ключевое слово. Исходный текст записывается в двойной массив в строку. Потом символы ключевого слова сортируются по алфавиту и все столбцы также меняются за ключевым словом, и выписывает строки. Вот пример для объяснения:
На английском все работает, на русском выдает ошибку:
Собственно, как сделать так, чтобы работал русский?
Вот код:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int v, LengthOfKey, HighOfTable, i, j, k;
string IT, Key;
char tabl[10][10];
void menu() { // Это меню
setlocale(LC_ALL, "Russian");
cout << "####################\n# 1) Зашифровать #\n# 2) Расшифровать #\n# 3) Выход #\n####################\n>";
cin >> v;
}
string lower(string x) { // Эта функция все большие буквы преобразует в маленькие
setlocale(LC_ALL, "Russian");
for (int i = 0; i < x.length(); i++) {
if (isupper(x[i]))
x[i] = tolower(x[i]);
}
return x;
}
string DeleteSpaces(string x) { // Эта функция убирает пробелы в строке
setlocale(LC_ALL, "Russian");
for (int i = 0; i < x.length(); i++) {
if (x[i] == ' ') {
x.erase(i, 1);
i--;
}
}
return x;
}
void SourceTabl() { // Эта функция просто записывает строку в двойной массив
k = 0;
for (int i = 0; i < HighOfTable; i++) {
for (int j = 0; j < LengthOfKey; j++) {
tabl[i][j] = IT[k];
cout << tabl[i][j] << " ";
k++;
}
cout << endl;
}
}
int main() {
setlocale(LC_ALL, "Russian");
menu();
while (v != 3) {
switch (v) {
case 1:
cout << "Введите исходный текст, который надо зашифровать - " << endl;
cin.ignore();
getline(cin, IT);
IT = DeleteSpaces(IT);
IT = lower(IT);
cout << "Введите ключ для шифровки - ";
cin >> Key;
Key = lower(Key);
LengthOfKey = Key.length();
HighOfTable = IT.length() / LengthOfKey;
cout << "Текст в исходной таблице шифрования: " << endl;
SourceTabl();
for (int i = 0; i < (LengthOfKey - 1); i++) {
for (int j = i + 1; j < LengthOfKey; j++) {
if (Key[i] > Key[j]) {
swap(Key[i], Key[j]);
for (int k = 0; k < HighOfTable; k++) {
swap(tabl[k][i], tabl[k][j]);
}
}
}
}
cout << "Перестановка столбцов:" << endl;
for (int i = 0; i < HighOfTable; i++) {
for (int j = 0; j < LengthOfKey; j++) {
cout << tabl[i][j] << " ";
}
cout << endl;
}
IT = "";
for (int j = 0; j < HighOfTable; j++) {
for (int i = 0; i < LengthOfKey; i++) {
IT = IT + tabl[j][i];
}
}
cout << "Криптограмма:" << endl;
cout << IT;
cout << endl;
menu();
break;
case 2:
cout << "1" << endl;
menu();
break;
default:
cout << "Ошибка! Введено неверное число!" << endl;
menu();
break;
}
}
system("pause");
return 0;
}
Вместо char
можно использовать unsigned char
, который гарантированно имеет нужный диапазон (0...255). Обычный char
в большинстве реализаций знаковый, а значит русские символы будет попадать на его отрицательную часть.
Судя по ошибке - алгоритм ожидает ANSI текст (ISO 8859-5? CP-1251? Скорее второе). Попробуйте наоборот, избавиться от utf-8 в коде начиная от кодировки файла и заканчивая опциями компилятора/студии. Ну и строки - обычные std::string
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
У меня есть файл foocpp, который содержит определения некоторых функций и функцию int main()
Создаю односвязный список с добавлением элемента рекурсивноРазобралась с функциями ввода/вывода рекурсивно и создала функцию добавления...
Помогите разобраться, не могу понять почему ядро вызывает COMPLETION_ROUTINE не дожидаясь новых данных в сокете?
Можно ли с помощью директивы #define заменить не одно слово на другое, а сразу кусок текста на другой кусок?