我有一个零终止字符串:
char* s = ...;
我正在生成C源代码(在运行时),我想输出一个表示s的字符串文字,它将在生成的C程序中为s生成一个相同的字符串。
我使用的算法是:
Output "
Foreach char c in s
if c == " output \"
else if c == \ output \\
else output c
Output "
除了"
和\
之外,还有其他任何需要特殊处理的角色吗?
答案 0 :(得分:7)
"
,\
,\r
和\n
以及\0
(和\?
as迈克尔伯尔mentions)。如果不这样做将会破坏您的代码。\x80
。如果源代码中包含非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
转义序列转换为其十六进制等效值。