Проблемы с получением информации о классификации персонажей с карты

0

У меня есть программа, которая отображает идентификатор типа ctype для текстового представления. Я использую std::map для сопоставления значения маски (ctype_base::mask) с строкой, которая представляет тип символа в строке. Проблема, с которой я столкнулась, заключается в том, что когда я пытаюсь распечатать значение, ничего не печатается для вывода. Почему это?

#include <iostream>
#include <map>
#include <vector>

class mask_attribute
{
private:
    typedef std::ctype_base base_type;
public:
    mask_attribute()
    {
        mask_names[base_type::space] = "space";
        mask_names[base_type::alpha] = "alpha";
        mask_names[base_type::digit] = "digit";
    }

    std::string get_mask_name(base_type::mask mask) const
    {
        std::string result = (*mask_names.find(mask)).second;
        return result;
    }
private:
    std::map<base_type::mask, std::string> mask_names;
};

int main()
{
    std::string a = "abc123";
    std::vector<std::ctype_base::mask> v(a.size());

    auto& f = std::use_facet<std::ctype<char>>(std::locale());
    f.is(&a[0], &a[0] + a.size(), &v[0]);

    for (unsigned i = 0; i < v.size(); ++i)
        std::cout << mask_attribute().get_mask_name(v[i]) << std::endl;
}

Ожидаемый результат:

alpha
alpha
alpha
digit
digit
digit

но вместо этого ничего не печатается. Что я сделал здесь неправильно и как это исправить?

  • 1
    Обратите внимание, как информация о классификации извлекается из вектора, заполненного ctype::is в примере cppreference
Теги:
c++11
locale
character
map

1 ответ

2
Лучший ответ

Распечатайте v[i] как целое число в шестнадцатеричном виде, которое может оказаться освещающим.

Вы ожидаете, что ctype::is производить ровно один бит для каждого символа. Это не то, что обычно происходит. Например, для 'a' вы, скорее всего, увидите alpha | lower | print alpha | lower | print alpha | lower | print. У вас нет записи для этого в mask_names, поэтому find возвращает mask_names.end(), который вы быстро разыскиваете, после чего ваша программа демонстрирует неопределенное поведение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню