3

時々制御文字を出力するプログラムがありますが、キャレット記法で印刷し、青色(のようにvim)にしたいと思います。今のところ、文字列を印刷する前に、boost::algorithm::replace_all()考えられる各制御文字(^Aから^Z、プラス^@、およびその他のいくつか)を呼び出す関数を使用しています。

これを行うためのより良い方法はありますか?私の現在の解決策は回避策であり、エラーが発生しやすいようです。

4

1 に答える 1

3

これが1つの解決策です(おそらく最もエレガントではありません):

std::string escape_control_characters(const std::string & s)
{
    std::string ret;
    for(std::string::const_iterator iter = s.begin(); iter != s.end(); ++iter)
    {
        const char c = *iter;
        if(c < ' ')
        {
            ret.push_back('^');
            ret.push_back(c + '@');
        }
        else if(c == '\x7F')
            ret.append("^?");
        else
            ret.push_back(c);
    }
    return ret;
}

デモ

これは青で着色された部分を処理しませんが、その方法をすでに知っているようですね?

ちなみに、タブと改行は技術的には制御文字 (それぞれと) ですが、おそらくそれらを印刷しても問題ないので、 のif(c < ' ')ようなものに変更したい場合があります。if(c < ' ' && c != '\t' && c != '\n')^I^J

于 2012-11-29T04:31:50.227 に答える