2013-10-18 5 views
1

지도에 전달 된 경우에도 전달 된 char * 배열을 찾지 못합니다. 지도에서 char *를 std :: string으로 바꿨을 때. 코드가 정상적으로 작동합니다. 평등에 대한 비교를 수행 할 때지도가 <을 사용하기 때문이다지도의 FIND 함수에 대한 잘못된 결과 얻기

static void CreateTranslationMap(); 
static UString FindTranslatedString(char* propertyName); 
static std::map<char*,UString> TranslationMap ; 

static void CreateTranslationMap() 
{ 
    UString engString("TextAlignmentPosition"); 
    char* transString= MSGTXT("TextAlignmentPosition"); 

    TranslationMap.insert(std::pair<char*,UString>(transString,engString)); 
} 



UString FindTranslatedString(char* propertyName) 
{ 
    UString NotFound("CannotFind"); 
    std::map<char*, UString>::iterator itr; 
    itr = TranslationMap.begin(); 
    itr = TranslationMap.find(propertyName); 
    if(itr!= TranslationMap.end()) 
    { 
     return itr->second; 
    } 
    else if(itr== TranslationMap.end()) 
    { 
     return NotFound; 
    } 

} 
+2

char *를 사용할 때 포인터가 아닌 문자열을 비교합니다. – RonenKr

답변

1

.

지도의 Keychar* 인 경우 포인터 (C 문자열이 아님)를 비교하고 있습니다. 그래서 하나의 포인터가 다른 포인터보다 작은 지 (즉, 주소를 비교하는지) 테스트하려고합니다.

실제로 다른보다 작은 결정하기 위해 문자열의 문자를 비교 std::string에 대해 정의 된 operator<를 사용 std::string지도의 Key입니다

.

std :: map은 템플릿이므로 실제로 작동하는 방식을 정의하는 데 더 많은 매개 변수가 필요합니다. 세 번째 매개 변수는 비교 기능입니다 (기본 값은 std::less<K>이며 기본값은 operator<).

그래서 char *를 사용할 수 있습니다. 사용자 정의 비교 연산자 만 있으면됩니다.

bool comparitor(char const* lhs, char const* rhs) 
{ 
    return (test for less than or some other strict weak function); 
} 
std::map<char*, UString, comparitor> myMap; 
0

이러한 포인터를 만들 때마다 다른 문자열 리터럴 포인터를 사용하기 때문에이 동작이 발생합니다. 내용이 P1과 P2 지점이 동일 할 동안

char* p1 = "Hello world!"; 
char* p2 = "Hello world!"; 

포인터는, 자신이, 다른 : 그래서, 예를 들어, 2 포인터를 만들 수 있습니다. 그래서 p1 != p2 그리고 포인터를지도에 저장하려고합니다. 대신 std :: string을 사용하거나 전역 상수 포인터를 사방에 사용해야합니다. 당신은 char

를 사용하여 포인터를 비교하는 자신 만의 비교를 사용할 필요가

const char* const c_transString = MSGTXT("TextAlignmentPosition"); 
... 
TranslationMap.insert(std::pair<char*,UString>(c_transString, engString)); 
... 
FindTranslatedString(c_transString) 
3

:처럼 뭔가

struct cmp_c_string 
{ 
    bool operator()(char const *lhs, char const *rhs) const 
    { 
     return std::strcmp(lhs, rhs) < 0; 
    } 
}; 

std::map<char*,UString, cmp_c_string > TranslationMap ; 
+0

아, 고전적인 실수.나는 이것을 몇 개월 전에 만들었습니다 =) [이 정보] (http://www.cplusplus.com/reference/map/map/)도 추가 할 수 있습니다 : ** 비교 ** 이진 술어는 두 개의 요소 키를 인수로 사용하여 bool을 리턴합니다. comp가이 유형의 객체이고 a와 b가 키 값인 표현 comp (a, b)는 함수가 정의한 엄격한 약한 순서에서 b가 b 앞에 있다고 간주되면 true를 반환합니다. – Raja

+0

그것은 나를 위해 일한다, 고마워! 필자의 경우 const char *를 맵의 키로 사용한다. –

0

의 char *를 사용하여, 그냥 주소를 비교합니다.

char a[] = "hi"; 
char b[] = "hi"; 
char *c = a; 
char *d = b; 

C & D는 문자열을 비교하려면 (C! = D), 당신을 strcmp를 사용해야합니다. 다릅니다.

그러나 문자열을 사용할 때 "=="연산을 덮어 씁니다. 그래서 당신은

string a = "hi"; 
string b = "hi"; 

& b는 동일하다 "=="을 사용하여 비교할 수 있습니다. (a == b)

0

지도 데이터 유형은 항상 const 형식의 문자열을 사용하기 때문에 char *를 const char *로 바꾸십시오. 나는 당신의 모범을 받아 내 터미널에서 달리고 있습니다. 따라서 새로운 코드는 다음과 같습니다 :

#include<iostream> 

    using namespace std; 
    static void CreateTranslationMap(); 
    static string FindTranslatedString(const char* propertyName); 
    static std::map<const char*,string> TranslationMap ; 

    static void CreateTranslationMap() 
    { 
     string engString("TextAlignmentPosition"); 
     const char* transString= ("1"); 
     TranslationMap.insert(std::pair<const char*,string>(transString,engString)); 
    } 


    string FindTranslatedString(const char* propertyName) 
    { 
     string NotFound("CannotFind"); 
     std::map<const char*, string>::iterator itr; 
     itr = TranslationMap.begin(); 
     itr = TranslationMap.find(propertyName); 
     if(itr!= TranslationMap.end()) 
     { 
      return itr->second; 
     } 
     else if(itr== TranslationMap.end()) 
     { 
     return NotFound; 
     } 

    } 

int main() 
    { 

    CreateTranslationMap(); 
    string s =FindTranslatedString("1"); 
    cout<<s<<endl; 

    return 0; 
    } 
관련 문제