3

我有一个程序会不时输出控制字符,我希望它们以插入符号打印并以蓝色(如vim)着色。现在,我使用一个函数,在打印字符串之前调用boost::algorithm::replace_all()我能想到的每个控制字符(^A通过^Z、加号和其他一些字符)。^@

有一个更好的方法吗?我目前的解决方案似乎变通了并且容易出错。

4

1 回答 1

3

这是一种解决方案(可能不是最优雅的):

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 回答