4

我有一个以零结尾的字符串:

char* s = ...;

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

我使用的算法是:

Output "

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

Output "

"除了and之外,我还需要对其他字符进行特殊处理\吗?

4

2 回答 2

8
  • 必须"对、\\rand\n进行编码\0\?正如 Michael Burr 所提到的)。不这样做会破坏你的代码。
  • 应该使用十六进制转义码对非 ASCII 字符进行编码,例如\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此外,对于任何其他不可打印的字符,我会使用转义序列转换为其十六进制等效项。

于 2012-08-31T05:09:19.633 回答