1

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;

こんにちは、赤で印刷されます。

4

1 に答える 1

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;
    }

もちろん、これは、等しいと思われる文字列が等しく比較されないという問題には対処していません。私たちがそれに答えられるようにするには、より完全な例を投稿する必要があると思います。しかし、埋め込まれたヌル文字に関する最初の答えは間違っています。あなたが持っているのは完全に正しい埋め込みエスケープ文字です。変数はマクロよりも扱いやすいので、私が違うことをする唯一のことは、#definesの代わりにconst char *RED=などを使用することです。

編集:私がここで言及していた答えが消えたようです。

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に続いてescapeを実行して、エスケープを入力します。最悪の場合、独自のCプログラムから印刷することでこれを生成できます。結局のところ、定義はすでにありますfprintf(conffile, "bold %s\n", BOLD)

于 2012-10-28T23:19:30.713 に答える