2017-02-09 4 views
2

Я пытаюсь создать программу, которая может динамически формировать символ escape-последовательности. Пожалуйста, взгляните на мой код ниже.Как динамически создавать escape-последовательность?

void ofApp::keyPressed(int key){ 

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

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

Например, если я нажимаю 'п' ключ, я ожидаю его распечатать

Здравствуйте

World

Но на самом деле печатает

Hello \ nWorld

Как я могу заставить программу работать? Заранее спасибо!

ответ

5

Вам нужно будет создать и поддерживать таблицу поиска, которая отображает escape-последовательности в их фактические коды символов.

Эквивалентные последовательности в строковых литералах оцениваются во время компиляции. Таким образом, futzing вокруг с кодом, пытаясь создать их во время выполнения, не приведет к чему-либо продуктивному. Таким образом, у вас действительно нет выбора, кроме как что-то вроде:

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; 
} 
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 
} 
Смежные вопросы