2012-10-28 42 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,我将不得不考虑这一点。这就是配置文件被指定写入赋值大纲的方式。我得问问我的老师这件事。谢谢 –