无法从地图获取字符分类信息

时间:2013-11-21 02:41:53

标签: c++ c++11 map character locale

我有一个程序将字符的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 个答案:

答案 0 :(得分:2)

以十六进制的形式打印v[i]整数,这可能证明是有启发性的。

您希望ctype::is为每个字符生成一位。这不是通常发生的事情。例如,对于'a',您可能会看到alpha | lower | print。您在mask_names中没有相应的条目,因此find会返回mask_names.end(),您会立即取消引用,因此您的程序会显示未定义的行为。