C String Literal必需的转义字符

时间:2012-08-31 04:12:13

标签: c string escaping

我有一个零终止字符串:

char* s = ...;

我正在生成C源代码(在运行时),我想输出一个表示s的字符串文字,它将在生成的C程序中为s生成一个相同的字符串。

我使用的算法是:

Output "

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

Output "

除了"\之外,还有其他任何需要特殊处理的角色吗?

2 个答案:

答案 0 :(得分:7)

  • 必须编码"\\r\n以及\0(和\? as迈克尔伯尔mentions)。如果不这样做将会破坏您的代码。
  • 使用十六进制转义码对非ASCII字符进行编码,例如: \x80。如果源代码中包含非ASCII字符,则为实现定义。对这些字符进行编码失败将对某些编译器起作用,但可能会破坏其他编译器。
  • 可以编码ASCII不可打印的字符。如果您使用\t\b\x05等字符的转义码,它会提高生成的源代码的可读性。如果您不这样做,您的代码仍然会工作,但可能很难阅读。
  • 需要在双引号字符串中转义'。这是合法的,但这是不必要的,它不会使源代码更具可读性。

答案 1 :(得分:4)

标准C中的转义序列集包括以下内容:

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

请注意,\?位于此处,因此问号可以转义,因此像"??!"这样的序列可以编码为“”\?\?!“防止它被解释为可怕的三角形。

为了完整性,我会考虑处理其中的每一个(虽然其中一些像\a\v我可能会使用\x转义序列来逃避 - 这可能取决于您的需求)。此外,对于任何其他不可打印的字符,我将使用\x转义序列转换为其十六进制等效值。