比较字符串和地图值
Compare string and map value
我正在尝试比较两个字符串
一个字符串是我从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)
。
- 有序地图字符串搜索与整数搜索之间的时间复杂度
- 标准地图如何知道使用标准字符串的数据作为键
- 如何调用返回双精度或字符串并将其保存在地图上但作为对象的类的方法
- 在地图键的矢量中查找多个字符串
- 如何在地图中使用字符串
- 使用地图来计数字符串输入
- 以C++显示字符串矢量<int>地图
- 在静态地图上保存的字符串已被覆盖
- 在地图中使用字符串向量
- 比较字符串和地图值
- 使用地图将字符串与枚举连接
- 最易读(代码术语)的方式,用 C++03 中的构造数据填充地图<字符串、字符串>
- 构建一个地图,它的键可以同时用作SRRing和字符串数组
- 如何在将多维 int 数组映射到 C++ 中的字符串时实现在地图上查找或计数
- C++ 将字符串插入地图时出现编译错误
- 如何将常量字符串值放入地图中
- 初始化地图<字符串、矢量<string>>
- sf::字符串放入 std::map 键不起作用 - vaule 没有保存到地图中
- 使用字符串**创建地图。我想我走错了路
- 如何将数据插入地图<字符串,设置<string>> C++?