我的程序输出的文本有时包含转义序列,例如“\ x1B [J”(清除屏幕)。反正有没有抑制转义序列,以便它不执行其相关的操作,而是通过其文本表示显示?
我甚至有兴趣为\ n和\ r。
执行此操作答案 0 :(得分:1)
通过将每次出现更改为\
来逃避\\
个字符。
请注意,只有在源代码中输入时,这些序列才有效。检查以下程序的结果:
#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;
}
答案 1 :(得分:0)
目前尚不清楚您想要干预的级别。如果你是
写输出,最简单的解决方案就是不插入
开头的人物。如果你通过了
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 );
}
}
};
只需将输出流声明为此类的实例即可 在调用要过滤的函数之前的参数。
此类可以轻松扩展,以过滤您的任何其他字符 不妨。