【问题标题】:C String Literal Required Escape CharactersC 字符串文字所需的转义字符
【发布时间】:2012-08-31 04:12:12
【问题描述】:

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

char* s = ...;

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

我使用的算法是:

Output "

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

Output "

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

【问题讨论】:

  • 还有很多其他的。 Unicode、单引号、换行等都需要特殊处理
  • 如果s 包含转义的\"怎么办?
  • @dda: 它将被正确编码为"...\\\"..."
  • @RichardJ.RossIII: 不会保留 unicode 和单引号吗?他们需要逃跑吗?
  • @Andrew:我认为Richard 提到的问题是C 实现的源字符集不一定与执行字符集相同。这是一种奇特的说法,仅仅因为char 可以包含某些字符(例如拉丁语 1 或 UTF-8)并不一定意味着源文件可以。此外,您没有质疑的更明显的一点是,换行符需要特殊处理。 ASCII 0x27 单引号不需要特殊处理,但 Windows CP-1252 和 \u2019 中 0x92 的“弯曲”引号可能。

标签: c string escaping


【解决方案1】:
  • 您必须将"、\、\r 和\n 和\0(以及\? 编码为Michael Burr mentions)。不这样做会破坏您的代码。
  • 您应该使用十六进制转义码对非 ASCII 字符进行编码,例如\x80。如果您的源代码中有非 ASCII 字符,则它是实现定义的。未能对这些字符进行编码在某些编译器上可以正常工作,但在其他编译器上可能会中断。
  • 您可以对 ASCII 不可打印字符进行编码。如果您将转义码用于\t、\b、\x05 等字符,它将提高生成源代码的可读性。如果您不这样做,您的代码仍然可以工作,但可能很难阅读。
  • 您不需要在双引号字符串中转义'。它是合法的,但它是不必要的,它不会使源代码更具可读性。

【讨论】:

  • 如果 C 字符串文字中有从 0x80 到 0xFF 的字节,它们不是按原样保留吗?
  • @AndrewTomazos-Fathomling:我相信这取决于实现。它可能会起作用,但依赖它是不明智的。
  • 我相信允许实现将源文件解释为(例如)UTF-8。如果您将 ISO-Latin 或 CP1252 字符串“按原样”写入源文件,那么您将失败,除非您在写入源文件后对其进行转码。我相信还允许实现将源文件解释为纯 ASCII,如果该文件包含不在标准要求的源字符列表中的任何字节,则拒绝该文件。然后你就失去了句号,除非你使用了转义码。
【解决方案2】:

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

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

注意\? 在那里,所以问号可以被转义,所以像"??!" 这样的序列可以编码为`"\?\?!"以防止它被解释为可怕的三合词。

为了完整起见,我会考虑处理其中的每一个(尽管其中一些像 \a 和 \v 我可能会使用 \x 转义序列进行转义 - 这可能取决于您的需要)。此外,对于任何其他不可打印的字符,我会使用 \x 转义序列转换为等效的十六进制。

【讨论】:

    猜你喜欢
    • 2012-04-30
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 2020-02-24
    相关资源
    最近更新 更多