如何以可读格式打印控制字符?

时间:2012-11-29 02:37:34

标签: c++ string formatting escaping

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

有更好的方法吗?我目前的解决方案看起来很麻烦,容易出错。

1 个答案:

答案 0 :(得分: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;
}

[demo]

这不会处理蓝色部分,但听起来你已经知道该怎么做了?

顺便说一句,您可能希望将if(c < ' ')更改为if(c < ' ' && c != '\t' && c != '\n')之类的内容,因为虽然制表符和换行符分别是技术控制字符(^I^J) ,它可能还可以打印它们。