2013-11-21 44 views
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

注意如何从[cppreference示例](http://en.cppreference.com/w/cpp/locale/ctype/is)中的'ctype :: is'填充的向量中提取分类信息, – Cubbi

回答

2

打印出十六进制为整数的v[i],这可能证明是照亮的。

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