4

私はゼロで終わる文字列を持っています:

char* s = ...;

また、C ソース コードを (実行時に) 生成しており、生成された C プログラムで s と同じ文字列を生成する s を表す文字列リテラルを出力したいと考えています。

私が使用しているアルゴリズムは次のとおりです。

Output "

Foreach char c in s
    if c == " output \"
    else if c == \ output \\
    else output c

Output "

と以外に特別な扱いをする必要がある文字は"あり\ますか?

4

2 に答える 2

8
  • 、、および(およびMichael Burrが言及しているように)をエンコードする必要があります。これを行わないと、コードが壊れます。"\\r\n\0\?
  • 非 ASCII 文字は、16 進数のエスケープ コードを使用してエンコードする必要があります\x80。ソース コードに非 ASCII 文字が含まれている場合は、実装定義です。これらの文字のエンコードに失敗しても、一部のコンパイラでは機能しますが、他のコンパイラでは機能しなくなる可能性があります。
  • ASCII の印刷不可能な文字をエンコードできます。\t\b、などの文字にエスケープ コードを使用すると、生成されたソース コードの可読性が向上します\x05。これを行わないと、コードは機能しますが、読みにくい場合があります。
  • 二重引用符で囲まれた文字列内でエスケープする必要はありません。'合法ですが、不要であり、ソース コードが読みやすくなりません。
于 2012-08-31T04:14:36.980 に答える
4

標準Cのエスケープシーケンスのセットには、次のものが含まれます。

\' 
\" 
\? 
\\ 
\a  (alert - usually Ctrl-G)
\b  (backspace)
\f  (form feed)
\n  
\r
\t
\v  (vertical tab)

\?がそこにあるので、疑問符をエスケープして、のようなシーケンス"??!"を `" \?\?!"としてエンコードできることに注意してください。それが恐ろしい三重音字として解釈されるのを防ぐため。

完全を期すために、私はこれらのそれぞれを処理することを検討します(ただし、それらのいくつかは好き\aで、代わりにエスケープシーケンス\vを使用してエスケープする可能性\xがあります-それはあなたのニーズに依存するかもしれません)。また、その他の印刷できない文字については、\xエスケープシーケンスを使用して16進数に変換します。

于 2012-08-31T05:09:19.633 に答える