2つの文字列を比較しようとしています
1つの文字列は、istringstreamから取得した通常の文字列です。
string command;
iss >> command;
もう1つは、マップから取得した文字列です。
しかし、それは機能していないようです。
アイデアは、私が持っているということです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」を取得すると、マップでその文字列を検索し、それに関連付けられているカラーコードを取得します。
次に、出力色をデフォルトに関連付けられたマップの色に変更します。次に、出力色を「太字」でマップに関連付けられている色に変更して「単純」という単語を印刷し、次に前の色に戻って残りの文を印刷します。
しかし、私がこれを行うとき:
cout << config.find("bold")->second << " hi" << endl;
色は変わりません。印刷されます。
\ e[0;31mこんにちは
出力色を変更する代わりに:/
だから私は比較をしようと思った、なぜならこのようなものだから:
cout << RED << "hi" << endl;
こんにちは、赤で印刷されます。