如何动态创建转义序列?

时间:2017-02-09 01:17:34

标签: c++ escaping character sequence

我试图创建一个可以动态形成转义序列字符的程序。 请看下面的代码。

void ofApp::keyPressed(int key){

    string escapeSeq;
    escapeSeq.push_back('\\');
    escapeSeq.push_back((char)key);

    string text = "Hello" + escapeSeq + "World";
    cout << text << endl;
}

例如,如果我按下&#39; n&#39;关键,我希望打印出来

  

您好

     

世界

但它确实打印出

  

您好\ nWorld

如何让程序运作?提前谢谢!

2 个答案:

答案 0 :(得分:5)

您必须创建并维护一个查找表,该表将转义序列映射到它们的实际字符代码。

字符串文字中的转义序列在编译时由编译器进行评估。因此,尽量使用代码,尝试在运行时创建它们,不会产生任何效率。所以你别无选择,只能采取以下措施:

void ofApp::keyPressed(int key){

    string escapeSeq;

    switch (key) {
    case 'n':
       escapeSeq.push_back('\n');
       break;
    case 'r':
       escapeSeq.push_back('\r');
       break;

    // Try to think of every escape sequence you wish to support
    // (there aren't really that many of them), and handle them
    // in the same fashion. 

    default:

       // Unknown sequence. Your original code would be as good
       // of a guess, as to what to do, as anything else...

       escapeSeq.push_back('\\');
       escapeSeq.push_back((char)key);
    }

    string text = "Hello" + escapeSeq + "World";
    cout << text << endl;
}

答案 1 :(得分:3)

您必须自己编写这样一个动态转义字符解析器。这是一个非常简单的版本:

char escape(char c)
{
    switch (c) {
    case 'b': return '\b';
    case 't': return '\t';
    case 'n': return '\n';
    case 'f': return '\f';
    case 'r': return '\r';
    // Add more cases here
    default: // perform some error handling
}