0

我的程序正在输出有时包含转义序列的文本,例如“\x1B[J”(清除屏幕)。有没有办法抑制转义序列,使其不执行相关操作,而是通过其文本表示形式显示?

我什至有兴趣为 \n 和 \r 这样做。

4

2 回答 2

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;
}
于 2013-02-05T11:47:48.327 回答
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 );
        }
    }
};

在调用要过滤的函数之前,只需声明一个以输出流为参数的类的实例。

此类很容易扩展以过滤您可能希望的任何其他字符。

于 2013-02-05T12:10:49.790 回答