3
我有一個程序傾向於不時地輸出控制字符,我希望它們用字符符號打印並用藍色着色(如vim
)。現在,我使用一個函數,在打印它之前使用一個字符串,爲我能想到的每個控制字符(^A
到^Z
,以及^@
和其他幾個字符)調用boost::algorithm::replace_all()
。如何以可讀格式打印控制字符?
有沒有更好的方法來做到這一點?我目前的解決方案似乎是行之有效的,容易出錯。
我有一個程序傾向於不時地輸出控制字符,我希望它們用字符符號打印並用藍色着色(如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;
}
[demo]
這不辦理有色在藍色的部分,但它聽起來像是你已經知道如何去做?
順便說一句,你可能要更改if(c < ' ')
喜歡的東西if(c < ' ' && c != '\t' && c != '\n')
,因爲雖然標籤和換行符在技術上控制字符(^I
和^J
,分別),這可能O.K.打印它們。
您的程序是否只輸出ASCII範圍內的字符('\ x00'到'\ x7F')?如果沒有 - 你想如何處理該範圍以外的字符? – ruakh
大多數情況下,是的,但偶爾會出現橢圓形和其他內容。在這種情況下,ASCII範圍之外的字符應該單獨保留 - 目前的設置很好地處理了這些字符。 –