我正在尝试比较两个字符串
一个字符串是我从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;
将以红色打印出来。
答案 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)
。