将转义序列显示为仅文本

时间:2013-02-05 11:38:29

标签: c++

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

我甚至有兴趣为\ n和\ r。

执行此操作

2 个答案:

答案 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 );
        }
    }
};

只需将输出流声明为此类的实例即可 在调用要过滤的函数之前的参数。

此类可以轻松扩展,以过滤您的任何其他字符 不妨。