2012-11-29 63 views
3

我有一個程序傾向​​於不時地輸出控制字符,我希望它們用字符符號打印並用藍色着色(如vim)。現在,我使用一個函數,在打印它之前使用一個字符串,爲我能想到的每個控制字符(^A^Z,以及^@和其他幾個字符)調用boost::algorithm::replace_all()如何以可讀格式打印控制字符?

有沒有更好的方法來做到這一點?我目前的解決方案似乎是行之有效的,容易出錯。

+0

您的程序是否只輸出ASCII範圍內的字符('\ x00'到'\ x7F')?如果沒有 - 你想如何處理該範圍以外的字符? – ruakh

+0

大多數情況下,是的,但偶爾會出現橢圓形和其他內容。在這種情況下,ASCII範圍之外的字符應該單獨保留 - 目前的設置很好地處理了這些字符。 –

回答

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,分別),這可能O.K.打印它們。

相關問題