我有一个以零结尾的字符串:
char* s = ...;
我正在生成 C 源代码(在运行时),我想输出一个表示 s 的字符串文字,它将在生成的 C 程序中生成与 s 相同的字符串。
我使用的算法是:
Output "
Foreach char c in s
if c == " output \"
else if c == \ output \\
else output c
Output "
"除了and之外,我还需要对其他字符进行特殊处理\吗?
"对、\和\rand\n进行编码\0(\?正如 Michael Burr 所提到的)。不这样做会破坏你的代码。\x80. 如果您的源代码中有非 ASCII 字符,则它是实现定义的。未能对这些字符进行编码将适用于某些编译器,但它可能会破坏其他编译器。\t如果您对, \b,等字符使用转义码,它将提高生成的源代码的可读性\x05。如果您不这样做,您的代码仍然可以工作,但可能难以阅读。'在双引号字符串中转义。这是合法的,但它是不必要的,它不会使源代码更具可读性。标准 C 中的转义序列集包括以下内容:
\'
\"
\?
\\
\a (alert - usually Ctrl-G)
\b (backspace)
\f (form feed)
\n
\r
\t
\v (vertical tab)
请注意,\?那里的问号可以转义,因此"??!"可以将类似的序列编码为`"\?\?!" 以防止它被解释为可怕的三合字母。
为了完整起见,我会考虑处理其中的每一个(尽管其中一些喜欢\a并且\v我可能会使用\x转义序列进行转义 - 这可能取决于您的需要)。\x此外,对于任何其他不可打印的字符,我会使用转义序列转换为其十六进制等效项。