Не работает русский язык в C++ (Ошибка)

139
24 сентября 2021, 19:10

Мой код должен зашифровать текст по ключевому слову. Суть шифра: Вы даете исходный текст и ключевое слово. Исходный текст записывается в двойной массив в строку. Потом символы ключевого слова сортируются по алфавиту и все столбцы также меняются за ключевым словом, и выписывает строки. Вот пример для объяснения:

На английском все работает, на русском выдает ошибку:

Собственно, как сделать так, чтобы работал русский?

Вот код:

#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;
}
Answer 1

Вместо char можно использовать unsigned char, который гарантированно имеет нужный диапазон (0...255). Обычный char в большинстве реализаций знаковый, а значит русские символы будет попадать на его отрицательную часть.

Answer 2

Судя по ошибке - алгоритм ожидает ANSI текст (ISO 8859-5? CP-1251? Скорее второе). Попробуйте наоборот, избавиться от utf-8 в коде начиная от кодировки файла и заканчивая опциями компилятора/студии. Ну и строки - обычные std::string

READ ALSO
2 функции int main()

2 функции int main()

У меня есть файл foocpp, который содержит определения некоторых функций и функцию int main()

83
Односвязный список рекурсивно

Односвязный список рекурсивно

Создаю односвязный список с добавлением элемента рекурсивноРазобралась с функциями ввода/вывода рекурсивно и создала функцию добавления...

191
WinApi ReadFileEx &amp; COMPLETION_ROUTINE

WinApi ReadFileEx & COMPLETION_ROUTINE

Помогите разобраться, не могу понять почему ядро вызывает COMPLETION_ROUTINE не дожидаясь новых данных в сокете?

80
define для нескольких слов

define для нескольких слов

Можно ли с помощью директивы #define заменить не одно слово на другое, а сразу кусок текста на другой кусок?

147