Как ввести сообщение через консоль в класс wstring?

Появилась такая проблема, при вводе сообщения через wcin в классе wstring программа просто прекращается, не выдавая никаких ошибок. Если же присваиваю переменной значение в самом коде, то все работает нормально.

#include <string>
using namespace std;

wstring alphabet_one = L"АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ ,абвгдеёжзийклмнопрстуфхцчшщъыь!?эюя;.-*";
wstring alphabet_two = L"ABCDEFGHIJKLMNOPQRSTUVWXYZ[]{}$#@+=_*&^%, -abcdefghijklmnopqr|/tuvwxyz:!?.";
wstring alphabet_three = L"АБВГДЕЁЖЗИЙКЛМНОПРСТУ ,абвгдеёжзий-клмнопрстуфхцчшщъыьэюя;ФХЦЧШЩ|/ЪЫЬЭЮЯ.*";
wstring alphabet_four = L"STUVWXYZ[]{}$#@+=_*&^%, abcdABCDEFGHIJKLMNOPQRefghijk-lmnopqrst|/uvwxyz:!?";

wstring crypt ( const wstring& message, const wstring& alphabet_one, const wstring& alphabet_two, const wstring& alphabet_three, const wstring& alphabet_four)
{
    wstring result;
    for (int i = 0; i < message.length(); i += 3)
    {
        int index = alphabet_one.find(message[i]);
        result += alphabet_two[index];
        if (i + 1 < message.length())
        {
            unsigned long index = alphabet_one.find(message[i+1]);
            result += alphabet_three[index];
        }
        if (i + 2 < message.length())
        {
            unsigned long index = alphabet_one.find(message[i+2]);
            result += alphabet_four[index];
        }
        }
    return result;
}
wstring decrypt ( const wstring& message, const wstring& alphabet_one, const wstring& alphabet_two, const wstring& alphabet_three, const wstring& alphabet_four)
{
    wstring result;
    for (int i = 0; i < message.length()  - 1; i += 3)
    {
        unsigned long index = alphabet_two.find(message[i]);
        result += alphabet_one[index];
        if (i + 1 < message.length())
        {
            unsigned long index = alphabet_three.find(message[i+1]);
            result += alphabet_one[index];
        }
        if (i + 2 < message.length())
        {
            unsigned long index = alphabet_four.find(message[i+2]);
            result += alphabet_one[index];
        }
    }
    return result;
}
int main()
{
    ios_base::sync_with_stdio(false);
    wcin.imbue(locale("en_US.UTF-8"));
    wcout.imbue(locale("en_US.UTF-8"));
    string var;
    cout << "Действие, которое необходимо сделать: 1 - шифрование, 2 - расшифровка" << endl;
    cin >> var;
    wstring message = L"Активы программного обеспечения - это прикладное программное обеспечение, системное программное обеспечение, и др.";
    if (var == "1")
    {
        wcout << crypt(message, alphabet_one, alphabet_two, alphabet_three, alphabet_four) << endl;
    }
    else
    {
        wcout << decrypt(message, alphabet_one, alphabet_two, alphabet_three, alphabet_four) << endl;
    }
}```

Ответы (1 шт):

Автор решения: AlexGlebe

Потоки cout, ... в iostream могут работать только в одном режиме : или в char или wchar_t. Разные буфера и т.д.

Ваши первые записи cout << "Д.. переключают поток в char режим. И последующее использование wcout работать не будет.

Решение такое :

wstring wvar;
wcout << L"Действие, которое необходимо сделать: 1 - шифрование, 2 - расшифровка" << endl;
wcin >> wvar;
if (wvar == L"1")
→ Ссылка