我有一个程序,它倾向于不时输出控制字符,我希望它们以插入符号打印并用蓝色着色(如vim
)。现在,我使用一个函数,在打印之前,在字符串上为我能想到的每个控制字符(^A
到^Z
,加上^@
和其他一些字符)调用boost::algorithm::replace_all()
。
有没有更好的方法可以做到这一点?我当前的解决方案似乎很通通,容易出错。
这里有一个解决方案(可能不是最优雅的):
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
),但打印它们可能是可以的。