比较字符串和地图值

时间:2012-10-28 23:09:47

标签: c++ string comparison maps

我正在尝试比较两个字符串

一个字符串是我从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

所以用户输入类似于:

(默认这是一个(粗体简单)示例。)

所以当我得到命令“default”时,我会在地图中搜索该字符串,然后获取与之关联的颜色代码。

然后我将输出颜色更改为与默认关联的地图中的颜色。 然后我将输出颜色更改为地图中与“粗体”关联的颜色以打印出单词“simple”,然后我将返回上一个颜色以打印出句子的其余部分。

但因为当我这样做时:

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

它不会改变颜色,它打印出来:

\ e [0; 31m hi

而不是更改输出颜色:/

所以我想我会做一个比较,因为这样的事情:

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

将以红色打印出来。

1 个答案:

答案 0 :(得分: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,因为变量比宏更容易处理。

编辑:似乎我在这里指的答案消失了。

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然后转义来输入转义。在最坏的情况下,您可以通过从您自己的C程序打印它们来生成它 - 毕竟您已经拥有了定义:fprintf(conffile, "bold %s\n", BOLD)