2013-04-30 5 views
1

작은 프로그램이 있는데,지도에서 특정 문자열을 검색하려고합니다. 정적 const 문자열 "find"를 전달하면 정확한 결과를 얻지 만 그렇지 않습니다. 문자열을 포인터로 복사하면 작동합니다. 나는 어떻게 전달 된 문자열의 주소를 비교하려고 시도하고 있다고 생각합니다. 어떤 이유로 인해 std :: string 제거 할 계획입니다.const char *지도에서 찾지 못함

using namespace std; 

static struct MarketLang { 
    const char* market; 
    const char* lang; 
} market_lang[] = { 
    {"us", "all"}, 
    {"el", "en,fr,it,de,es"}, 
    {"xx", "na"}, 
}; 

class MarketLangMap { 
    map<const char*, MarketLang *> table; 
    public: 
    MarketLangMap() { 
     int TOTAL_MARKET_INFO = sizeof(market_lang)/sizeof(MarketLang); 
     for (int i = 0; i < TOTAL_MARKET_INFO; i++) { 
      table[market_lang[i].market] = market_lang+ i; 
     } 
    } 

    MarketLang *operator[](const char* s) { 
     if (table.find(s) != table.end()) { 
      return table.find(s)->second; 
     } else { 
      return table.find("xx")->second; 
     } 
    } 
}; 


int 
main() 
{ 

    MarketLangMap *m = new MarketLangMap(); 
    const char* r = "us"; 
    char* p = new char(10); 
    strcpy(p, "us"); 
    std::cout<<(*m)["us"]->lang <<std::endl;`` 
    std::cout<<(*m)[r]->lang <<std::endl; 
    std::cout<<(*m)[p]->lang <<std::endl; 

} 

예상 출력 : 모든 모든 모든

여기서 코드

실제 출력 입력 모든 모든 의해 NA

+1

당신은 표준을 사용하려면 : 문자열이 아닌 char * const는 두 문자열을 올바르게 비교합니다 (즉,보다 작음 연산자를 구현합니다). 반면 후자는 문자열 자체가 아닌 포인터를 비교합니다. –

+0

또는 키를 비교할 수있는 [std :: map] (http://www.cplusplus.com/reference/map/map/)의 세 번째 템플릿 매개 변수로 자신의 이진 조건자를 제공 할 수 있습니다. –

+0

동의하지만 std :: string없이 수행 할 수있는 방법이 있습니까? C 세계에서 어떻게 이루어 졌습니까 (저는지도가 C 세계에 없다는 것을 알고 있습니다)? – Jazz

답변

3

std::map 엄격한 약한 정렬 기준을 사용을 나타낸 그 내부 비교 개체. 기본값은입니다..

std::less은 인수를 문자열로 처리하지 않고 단지 포인터로보고 포인터가 다른 포인터보다 작은 지 여부 만 확인합니다. 그러나

을 수행 할 수 있습니다 (하지만 난 당신이 C와 C++를 혼합 피하기 위해 std::string를 사용해야 추측), 문자열로 처리, char* 인수를 비교하는 새로운 클래스를 만들 :

#include <cstring> 

struct ConstCharStarComparator 
{ 
    bool operator()(const char *s1, const char *s2) const 
    { 
    return strcmp(s1, s2) < 0; 
    } 
}; 

map<const char*, MarketLang *, ConstCharStarComparator> table;