2013-11-21 2 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

숫자가 16 진수 인 v[i]을 인쇄하면 밝게 빛날 수 있습니다.

ctype::is은 각 문자에 정확히 하나의 비트를 생성 할 것으로 예상됩니다. 그것은 정상적으로 발생하지 않습니다. 예를 들어 'a'의 경우 alpha | lower | print이 표시 될 수 있습니다. 이것에 대한 항목이 mask_names에 없으므로 findmask_names.end()을 반환합니다. 그러면 즉시 참조가 취소되고 프로그램에 정의되지 않은 동작이 표시됩니다.

관련 문제