仅将转义序列显示为文本
Display escape sequences as text only
我的程序正在输出文本,其中有时包含转义序列,如"\x1B[J"(清除屏幕)。是否有任何方法可以抑制转义序列,使其不执行相关操作,而是通过文本表示显示?
我甚至有兴趣为\n和\r做这件事。
通过将每次出现的字符更改为\
来转义字符。
请注意,当您在源代码中输入这些序列时,这些序列才起作用。检查以下程序的结果:
#include <cstdio>
int main(int argc, char * argv[])
{
char test[3] = { 0x5c, 0x6e, 0x00 }; // n
char * test2 = "\n"; // n
printf("%sn", test);
printf("%sn", test2);
printf(test);
printf(test2);
return 0;
}
目前尚不清楚您希望在什么级别进行干预。如果你在编写输出时,最简单的解决方案就是不插入开头的字符。如果你通过std::ostream
到某个库,并且它正在插入字符,插入一个过滤流buf就相当简单了并将它们过滤掉。类似对于标准的转义序列,以下应该可以做到:
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 );
}
}
};
只需将该类的一个实例和输出流声明为参数,然后再调用要筛选的函数。
这个类可以很容易地扩展为过滤您的任何其他字符可能希望。
相关文章:
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 在由Sublime文本3编译后在cmd上显示Java程序输出
- 尝试使用 WinBGI 显示文本时出现编译器错误
- 动态填充的组合框不显示文本,列表未定义
- 使用 fltk 时,文本未显示在已编译的窗口中
- PyQT - 在 QTableWidget 单元格中显示垂直文本
- 如何使用IExecuteCommand和动词在上下文菜单外壳扩展中显示本地化文本和自定义图标?
- 如何在 qt c++ 中更新 QWindow,文本不显示
- 从文本文件中读取并输入到数组结构中,然后显示读取的数据C++
- sf::文本不显示?
- 在QT C++编辑Qtable模型数据时,我需要得到一个小盒子,我需要显示编辑文本,这怎么可能?
- QTreeWidgetItem 突出显示文本问题
- 从文本文件中读取数据并删除所有换行符空格,并在 C++ 控制台中显示
- 如何通过单击按钮在QTextEdit中显示文本?
- 在C Windows程序中显示文本文件内容
- 如何在重新调整窗口大小时使文本显示在窗口中心,visualc++
- 打开 GL 文本显示时未处理的异常
- 如何要求输入后的文本显示下一行在c++中
- 如何将文件的路径(或任何文本)显示/附加到编辑框中?(C++ Win32 API)
- 将格式化文本显示到 QTextEdit 就像在 C 的 printf 中一样