C字符串字面量需要转义字符

4

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

char* s = ...;

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

我使用的算法是:

Output "

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

Output "

除了"\之外,还有其他需要特殊处理的字符吗?

还有许多其他的情况需要特别处理。Unicode、单引号、换行等都需要特殊处理。 - Richard J. Ross III
如果s包含转义字符",会怎么样? - dda
@dda:那样它将正确地被编码为"...\\\"..." - Andrew Tomazos
@RichardJ.RossIII:Unicode和单引号会被保留吗?它们需要转义吗? - Andrew Tomazos
@SteveJessop: https://dev59.com/H2ct5IYBdhLWcg3wQ7bP - Andrew Tomazos
显示剩余3条评论
2个回答

9
  • 必须对"\\r\n\0进行编码(Michael Burr在这里提到还需要对\?进行编码)。如果不按照要求做,代码将无法正常运行。
  • 应该使用十六进制转义码对非ASCII字符进行编码,例如\x80。如果源代码中包含非ASCII字符,则其实现是未定义的。如果不对这些字符进行编码,某些编译器可能能够正常工作,但其他编译器可能会出现问题。
  • 可以对ASCII不可打印字符进行编码。如果使用转义码(如\t\b\x05等)来进行编码,生成的源代码可读性会更好。如果不这样做,代码仍然可以正常工作,但可能很难阅读。
  • 在双引号字符串中,不需要转义'。虽然合法,但不必要且不利于源代码的可读性。

如果C字符串字面量中有0x80到0xFF之间的字节,那么它们不是按原样保留吗? - Andrew Tomazos
@AndrewTomazos-Fathomling:我认为这取决于具体实现。它可能会起作用,但依赖它并不明智。 - Mark Byers
我相信实现可以将源文件解释为(例如)UTF-8。如果您将ISO-Latin或CP1252字符串“原样”写入源文件,则会丢失,除非在编写源文件后对其进行转码。我认为实现也可以将源文件解释为纯ASCII,并拒绝包含标准所需源字符列表之外的任何字节的文件。然后你就输了,除非你使用转义代码。 - Steve Jessop

4
在标准C中,逃逸序列的集合包括以下内容:
\' 
\" 
\? 
\\ 
\a  (alert - usually Ctrl-G)
\b  (backspace)
\f  (form feed)
\n  
\r
\t
\v  (vertical tab)

请注意,\?是为了转义问号,这样类似于"??!"的序列就可以被编码为"\?\?!",以防止它被解释为可怕的三字符组合。
为了完整起见,我会考虑处理其中的每一个(尽管像\a\v这样的一些字符我可能会使用\x转义序列进行转义 - 这可能取决于您的需求)。此外,对于任何其他不可打印字符,我将使用\x转义序列将其转换为其十六进制等效形式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接