【问题标题】:How can I print control characters in a readable format?如何以可读格式打印控制字符?
【发布时间】:2012-11-29 02:37:33
【问题描述】:

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

有没有更好的方法来做到这一点?我目前的解决方案似乎变通了,而且容易出错。

【问题讨论】:

  • 您的程序是否只输出 ASCII 范围内的字符(\x00\x7F)?如果不是——你想如何处理超出该范围的字符?
  • 在大多数情况下,是的,但偶尔会有省略号字符和其他内容。在这种情况下,ASCII 范围之外的字符可能应该被单独保留——当前设置可以很好地处理这些字符。

标签: c++ string formatting escaping


【解决方案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 &lt; ' ') 更改为if(c &lt; ' ' &amp;&amp; c != '\t' &amp;&amp; c != '\n'),因为虽然制表符和换行符在技术上是控制字符(分别为^I^J),但它可能没问题。打印出来。

【讨论】:

    猜你喜欢
    • 2021-07-25
    • 2020-07-02
    • 2017-04-11
    • 1970-01-01
    • 2019-04-13
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    相关资源
    最近更新 更多