我的程序正在输出有时包含转义序列的文本,例如“\x1B[J”(清除屏幕)。有没有办法抑制转义序列,使其不执行相关操作,而是通过其文本表示形式显示?
我什至有兴趣为 \n 和 \r 这样做。
我的程序正在输出有时包含转义序列的文本,例如“\x1B[J”(清除屏幕)。有没有办法抑制转义序列,使其不执行相关操作,而是通过其文本表示形式显示?
我什至有兴趣为 \n 和 \r 这样做。
通过将每个出现更改为 来转义\
字符\\
。
请注意,这些序列仅在您将它们输入源代码时才有效。检查以下程序的结果:
#include <cstdio>
int main(int argc, char * argv[])
{
char test[3] = { 0x5c, 0x6e, 0x00 }; // \n
char * test2 = "\\n"; // \n
printf("%s\n", test);
printf("%s\n", test2);
printf(test);
printf(test2);
return 0;
}
目前尚不清楚您要在哪个级别进行干预。如果您正在编写输出,最简单的解决方案就是不插入开头的字符。如果您将 an 传递
std::ostream
给某个库,并且它正在插入字符,那么将过滤 streambuf 插入输出流并将它们过滤掉是相当简单的。对于标准转义序列,以下内容应该可以解决问题:
class EscapeSequenceFilter
{
std::streambuf* myDest;
std::ostream* myOwner;
bool myIsInEscapeSequence;
protected:
int overflow( int ch )
{
int retval = ch == EOF ? ch : 0;
if ( myIsInEscapeSequence ) {
if ( isalpha( ch ) ) {
myIsInEscapeSequence = false;
} else if ( ch == 0x1B ) {
myIsInEscapeSequence = true;
} else {
retval = myDest->sputc( ch );
}
return retval;
}
public:
EscapeSequenceFilter( std::streambuf* dest )
: myDest( dest )
, myOwner( NULL )
, myIsInEscapeSequence( false )
{
}
EscapeSequenceFilter( std::ostream& dest )
: myDest( dest.rdbuf() )
, myOwner( &dest )
, myIsInEscapeSequence( false )
{
myOwner->rdbuf( this );
}
~EscapeSequenceFilter()
{
if ( myOwner != NULL ) {
myOwner->rdbuf( myDest );
}
}
};
在调用要过滤的函数之前,只需声明一个以输出流为参数的类的实例。
此类很容易扩展以过滤您可能希望的任何其他字符。