2012-10-28 92 views
1

我想比較兩個字符串比較字符串和映射值

一個字符串是一個正常的字符串,我從一個istringstream有:

string command; 
iss >> command; 

,另一個是一個字符串,我從得到我的地圖。

但它似乎並沒有工作。

的想法是,我有一個map<string, string>,該值是一個 轉義碼來改變終端輸出顏色。

我在我的main中有一張地圖,我把所有的鍵和值都放到了 (它工作,我測試過了),所以我把地圖傳遞給了這個函數。

我也有我的程序的開頭定義的顏色:

#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" 

這是一個似乎並沒有被工作和困惑我的部分:

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 
} 

我會作出這樣的switch,但C++不允許在字符串上進行切換。

所以問題是,即使兩個字符串都是相同的,它不會像那樣工作。

我意識到m.find()正在我們正在尋找的位置返回一個迭代器。 但是,然後做m.find()->second應該得到正確的價值? 而且值是一個字符串,不是嗎?

所以總之,我不確定爲什麼比較不起作用。

編輯:

好吧,這裏是我說的是配置文件:

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

這樣用戶輸入會是這樣的:

(默認這是一個(大膽的簡單)的例子。)

所以當我得到的命令「默認」,我會在我的地圖對於搜索字符串,然後得到的C與它相關的代碼。

然後我會將輸出顏色更改爲與默認相關的地圖中的顏色。 然後,我將輸出顏色更改爲在地圖「大膽」相關的彩色打印出來的字「簡單」,然後我會回到以前的彩色打印出來的句子的其餘部分。

而是因爲當我這樣做:

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

它不會改變顏色,它打印出:

\ E [0;31米喜

,而不是改變輸出顏色:/

,所以我想我會做一個比較,因爲這樣的事情:

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; 
    } 

當然,這並沒有解決不等於相等的字符串的問題。我想,你需要發佈一個更完整的例子來回答這個問題。但關於嵌入空字符的第一個答案是錯誤的。你有什麼是嵌入轉義字符,這是完全正確的。我唯一會做的不同就是使用const char * RED =等來代替#defines,因爲變量比宏更容易處理。

編輯:好像我在這裏提到的答案消失了。

編輯2:這與您想要做的比較如何?這對我的作品,至少:

#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 

應該產生指示的顏色。

編輯3:根據您的新信息,看起來真正的問題是您的配置文件包含的實際轉義字符不包含字符'\'和'e'。確保你的文件實際上包含真正的轉義字符。如何產生這些不同從編輯器到編輯器。在vim中,你可以通過按ctrl-V和escape來鍵入一個轉義。在最糟糕的情況下,您可以通過從您自己的C程序中打印來生成這個文件 - 畢竟您已經有了定義:fprintf(conffile, "bold %s\n", BOLD)

+0

這有點複雜。關鍵是,我正在映射一個配置文件;它會告訴我該命令是什麼以及相應的顏色是什麼。 一旦我有了映射,我從標準輸入行中,並且當指定一個命令時,我必須將輸出顏色更改爲與該命令關聯的顏色。但是我不能在找到命令後使用它 - >秒來改變顏色,因爲它只是打印出字符串而不是改變顏色,這真的很奇怪。所以我需要做一個比較......但即使這樣也很困難。看起來它 - >第二個不給我一個字符串:/ –

+0

好吧,我編輯了我原來的帖子,以提供更多關於我想要做的事情的信息。 –

+0

我明白了。這是有道理的。我正在使用cygwin,我將不得不考慮這一點。這就是配置文件被指定寫入賦值大綱的方式。我得問問我的老師這件事。謝謝 –