2012-11-29 3 views
3

나는 때때로 제어 문자를 출력하는 경향이있는 프로그램을 가지고 있는데, 나는 캐럿 표기법으로 인쇄하고 파란색으로 색칠을하고 싶다. (vim). 지금은 문자 (^A에서 ^Z까지 플러스 ^@ 및 그 외 일부)를 인쇄하기 전에 문자열에 대해 각각의 제어 문자에 대해 boost::algorithm::replace_all()을 호출하는 함수를 사용합니다.제어 문자를 읽을 수있는 형식으로 인쇄하는 방법은 무엇입니까?

더 좋은 방법이 있나요? 내 현재 솔루션 workaroundish 보인다 및 오류가 발생하기 쉬운.

+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]

이하지 않습니다 처리 부분에 파랑 색,하지만 당신은 이미 방법을 알고있는 것 같은데 그렇게? 그런데

, 당신은 아마 오케이의 탭과 개행 기술적 문자 (각각 ^I^J 등)를 제어하고 있지만 있기 때문에, if(c < ' ' && c != '\t' && c != '\n')처럼 뭔가 if(c < ' ')을 변경할 수 있습니다 그들을 인쇄하십시오.

관련 문제