2017-02-09 13 views
2

私は動的にエスケープシーケンス文字を形成できるプログラムを作ろうとしています。 以下のコードをご覧ください。例えばエスケープシーケンスを動的に作成する方法は?

void ofApp::keyPressed(int key){ 

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

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

、私は 'n' のキーを押すと、私は

からこんにちは

世界

を印刷することを期待していしかし、それは実際に

をプリントアウト

こんにちは\ nワールド

プログラムを動作させるにはどうすればよいですか?前もって感謝します!

答えて

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; 
} 
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 
} 
関連する問題