2012-10-28 19 views
1

캐릭터와 맵 값을 비교 :내가 <p>한 문자열이 내가 istringstream에서 가져온 일반 문자열 두 문자열</p>을 비교하기 위해 노력하고있어

string command; 
iss >> command; 

다른 하나는 내가로부터 얻을 문자열입니다 내지도.

하지만 작동하지 않는 것 같습니다.

아이디어는 내가 map<string, string>이고, 값은 이스케이프 코드로 터미널 출력 색상을 변경하는 것입니다.

main에지도가 있는데이 키와 값을 모두 (작동 함, 테스트 함)에 넣었으므로이 기능에지도를 전달합니다.

string getColor(string command, map<string, string> &m) 
{ 
    string color; 
    if((m.find(command)->second).compare(RED) == 0) 
    { 
    color = RED; 
    return color; 
    } 
    // ...and so on for all the other colors 
} 

나는 이것을을 만들었을 것입니다 :이 작업 나를 혼동되지 않는 것 같다 부분은

#define BLACK "\033[22;30m" 
#define RED "\033[22;31m" 
#define GREEN "\033[22;32m" 
#define BROWN "\033[22;33m" 
#define BLUE "\033[22;34m" 
#define PURPLE "\033[22;35m" 
#define CYAN "\033[22;36m" 
#define GREY "\033[22;37m" 
#define DARK_GREY "\033[01;30m" 
#define LIGHT_RED "\033[01;31m" 
#define LIGHT_GREEN "\033[01;32m" 
#define YELLOW "\033[01;33m" 
#define LIGHT_BLUE "\033[01;34m" 
#define LIGHT_PURPLE "\033[01;35m" 
#define LIGHT_CYAN "\033[01;36m" 
#define WHITE "\033[01;37m" 

: 나는 또한 내 프로그램의 상단에 색상을 정의

switch이지만 C++은 문자열에서 스위치를 허용하지 않습니다.

문제는 두 문자열이 같아도 문제가되지 않는다는 것입니다.

m.find()은 우리가 찾고있는 위치에서 반복자를 반환한다는 것을 알고 있습니다. 그런 다음 m.find()->second을 수행하는 것이 올바른 가치에 도달해야합니까? 그리고 값은 문자열입니다, 그렇지 않습니까?

간단히 말해서 왜 비교가 효과가 없는지 잘 모르겠습니다.

편집 :

좋아, 여기에 내가 얘기 한 설정 파일은 다음과 같습니다

bold   \e[0;31m 
italic   \e[0;34m 
underline  \e[0;32m 
default  \e[0;37m 

때문에 사용자 입력은 같은 것입니다 :

은 ((이것은 기본적 굵게 간단한 예).

그래서 "default"명령을받을 때지도에서 해당 문자열을 검색 한 다음 c 그것과 관련된 olour 코드.

그런 다음 출력 색상을 기본값과 연결된지도의 색상으로 변경합니다. 그러면 출력 색상을지도에서 "굵은 글씨"로 표시된 색상으로 변경하여 "simple"이라는 단어를 인쇄 한 다음 이전 색상으로 돌아가 나머지 문장을 인쇄합니다.나는이 작업을 수행 할 때 때문에

하지만

는 :

cout << config.find("bold")->second << " hi" << endl; 

는 색상을 변경하지 않습니다, 그것은 출력한다 : 전자 [0 \

, 31m 하이

대신 출력을 변경 색깔 :/

그래서 나는 이렇게 할 것이기 때문에 비교를 할 것이라고 생각했다 :

cout << RED << "hi" << endl; 

은 빨간색으로 하이를 인쇄합니다.

+0

ewwwwwwwwwww 매크로가 잘못되었습니다! – Puppy

답변

0

매우 복잡한지도 조회를하는 것처럼 들립니다. 이게 효과가 없을까요?

const string & getColor(string command, const map<string, string> & m) 
    { 
     map<string,string>::const_iterator i = m.find(command); 
     return i == m.end() ? BLACK : i->second; 
    } 

는 물론, 이것은 아마도 동일한 문자열이 동일하게 비교하지 않는 문제를 해결하지 않습니다. 우리가 대답 할 수있는 더 완전한 예제를 게시 할 필요가 있다고 생각합니다. 그러나 내장 null 문자에 대한 첫 번째 대답은 잘못된 것입니다. 당신이 가지고있는 것은 이스케이프 문자가 내장 된 것입니다. 이것은 완전히 정확합니다. 변수가 매크로보다 다루기 쉽기 때문에 #defines 대신 const char * RED = 등을 사용하는 것이 유일한 방법입니다.

편집 : 내가 사라 여기에 언급 된 대답처럼 보인다.

Edit2가 : 어떻게 당신이 뭘 하려는지 비교합니까? 그것은 적어도 나를 위해 작동 : 표시된 색상을해야

#include <cstdio> 
    #include <string> 
    #include <iostream> 
    #include <sstream> 
    #include <map> 
    using namespace std; 

    #define BLACK "\033[22;30m" 
    #define RED "\033[22;31m" 
    #define GREEN "\033[22;32m" 

    const string & getColor(const string & command, const map<string, string> & m) 
    { 
     map<string,string>::const_iterator i = m.find(command); 
     return i == m.end() ? BLACK : i->second; 
    } 

    int main() { 
     map<string,string> cols; 
     cols["BLACK"] = BLACK; 
     cols["RED"] = RED; 
     cols["GREEN"] = GREEN; 

     string line, cmd, val; 
     while(getline(cin, line)) 
     { 
      stringstream ss(line); 
      if(ss >> cmd >> val && cmd == "color:") 
       cout << getColor(val, cols); 
      else cout << line << endl; 
     } 
    } 

입력

This text is default color 
color: RED 
This text is red 
color: GREEN 
This text is green 

.

EDIT3은 : 진짜 문제는 바로 문자 '\'와 'E', 설정 파일이 실제 이스케이프 문자를 포함하지 않는 포함되어 있다는 것입니다처럼 새로운 정보에 비추어, 그것은 보인다. 파일에 실제로 실제 이스케이프 문자가 포함되어 있는지 확인하십시오. 생성 방법은 편집기마다 다릅니다. vim에서는 ctrl-V를 누른 다음 escape을 입력하여 이스케이프를 입력합니다. 최악의 경우, 자신의 C 프로그램에서 인쇄하여 이것을 생성 할 수 있습니다. 이미 정의가 있습니다. fprintf(conffile, "bold %s\n", BOLD).

+0

조금 복잡합니다. 요점은, 나는 설정 파일을 매핑하고있다. 그것은 명령이 무엇이고 해당 색이 무엇인지 말해 줄 것입니다. 매핑이 완료되면 표준 입력에서 줄을 가져오고 명령을 지정하면 명령과 관련된 색으로 출력 색을 변경해야합니다. 하지만 색상을 변경하는 대신 단지 문자열을 출력하기 때문에 명령을 찾은 후 두 번째로 색상을 변경할 수는 없습니다. 이는 정말 이상합니다. 그래서 나는 비교를 할 필요가있다. 그러나 심지어 그것은 어렵다는 것을 증명하고있다. 그것은 -> 두 번째는 나에게 문자열을주지 않는 것 같습니다 :/ –

+0

좋아, 내가 뭘하려고하는지 조금 더 많은 정보를 제공하기 위해 원래의 게시물을 편집했습니다. –

+0

나는 본다. 그것은 말이 될 것입니다. 나는 cygwin을 사용하고있다. 나는 그것을 조사해야 할 것이다. 이는 설정 파일이 할당 개요에 기록되도록 지정된 방법이었습니다. 강사에게 이것에 대해 물어봐야 할 것입니다. 감사합니다 –

관련 문제