@Nikita1244
Anonymous

Что делать с этой проблемой?

Здравствуйте! Пишу программу, которая будет преобразовывать из обычных букв в символы Азбуки Морзе.
Написал такой код:
#include <iostream>
#include <string>
#include <sstream>

using namespace std;

string encrypt(const string &s) {
    setlocale(LC_ALL, "Russian");
    ostringstream result;
    for (string::size_type i = 0; i < s.size(); i++) {\
        switch (s[i]) {
            case 'А':
                result << "•−" << " ";
                break;
            default:
                cout << "Неизвестный символ в строке! Работа программы прервана" << endl;
                return 0;
        }
    }
    return result.str();
}

// string decrypt() {}

int main() {
    setlocale(LC_ALL, "ru_RU.utf8");
    string s;
    cin >> s;
    cout << encrypt(s);
}


Возникает ошибка:
Неизвестный символ в строке! Работа программы прервана
terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string: construction from null is not valid

А также сообщение в CLion:
Character too large for enclosing character literal type


Как я выяснил в Гугле, каждый символ русского алфавита - 2 байта. А char вмещает только 1 байт. Что делать?
  • Вопрос задан
  • 774 просмотра
Решения вопроса 2
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Исходник в кодировке utf. 'А' действительно занимает 2 байта. Что видит компилятор? Видит 2 байта между кавычками и ругается.

setlocale() - эта функция во время исполнения программы настроит, в какой кодировке у вас будет просиходить ввод/вывод с консоли. На кодировку исходника оно никак не влияет.

Тут 2 варианта решения: Или поменяйте кодировку исходника и настройки локали, чтобы 'А' занимало один байт, или работайте с wstring.

Чтобы не путаться с кодировками, напишите программу, которая выводит численное значение байт прочитанной строки. Запустите ее, введите туда 'А', смотрите, что оно выводит. Поэксперементируйте с разными настройками setlocale(). Если выводит 2 байта - вот эти два байта надо писать в case и использовать wstring. Если выводит один байт, вот его в case и вставляйте.
Ответ написан
@dima20155
you don't choose c++. It chooses you
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы