比较字符串和地图值

Compare string and map value

本文关键字:地图 字符串 比较      更新时间:2023-10-16

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

一个字符串是我从Isringstream获得的普通字符串:

string command;
iss >> command;

,另一个是我从地图上获得的字符串。

,但似乎不起作用。

这个想法是我有一个 map<string, string>,值是逃脱代码更改终端输出颜色。

我的 main中有一个地图,我将所有键和值放入(有效,我已经对此进行了测试)所以我将地图传递到了此功能中。

我还在程序的顶部定义了颜色:

#define BLACK "33[22;30m"
#define RED "33[22;31m"
#define GREEN "33[22;32m"
#define BROWN "33[22;33m"
#define BLUE "33[22;34m"
#define PURPLE "33[22;35m"
#define CYAN "33[22;36m"
#define GREY "33[22;37m"
#define DARK_GREY "33[01;30m"
#define LIGHT_RED "33[01;31m"
#define LIGHT_GREEN "33[01;32m"
#define YELLOW "33[01;33m"
#define LIGHT_BLUE "33[01;34m"
#define LIGHT_PURPLE "33[01;35m"
#define LIGHT_CYAN "33[01;36m"
#define WHITE "33[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

因此,用户输入将是:

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

因此,当我获得命令"默认"时,我将在地图中搜索该字符串,然后获得与之关联的颜色代码。

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

但是,当我这样做时:

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

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

e [0; 31m hi

而不是更改输出颜色:/

所以我认为我会进行比较,因为这样的事情:

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

将以红色打印出HI。

听起来您正在尝试进行非常复杂的地图查找。这个不起作用吗?

    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 "33[22;30m"
    #define RED "33[22;31m"
    #define GREEN "33[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 %sn", BOLD)