【发布时间】:2012-10-28 23:09:47
【问题描述】:
我正在尝试比较两个字符串
一个字符串是我从 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
所以用户输入会是这样的:
(默认这是一个(粗体简单)示例。)
所以当我得到“默认”命令时,我会在我的地图中搜索该字符串,然后获取与之关联的颜色代码。
然后我将输出颜色更改为与默认关联的地图中的颜色。 然后我将输出颜色更改为地图中与“bold”关联的颜色以打印出“simple”一词,然后我将返回之前的颜色以打印出句子的其余部分。
但是因为当我这样做时:
cout << config.find("bold")->second << " hi" << endl;
它不会改变颜色,它会打印出来:
\e[0;31m 嗨
而不是改变输出颜色:/
所以我想我会做一个比较,因为像这样:
cout << RED << "hi" << endl;
将以红色打印出 hi。
【问题讨论】:
-
ewwwwwwwww 宏坏了!
标签: c++ string comparison maps