【问题标题】:Write a program to check if a character forms an escape character in C编写一个程序来检查一个字符是否在 C 中形成一个转义字符
【发布时间】:2010-10-10 15:36:24
【问题描述】:

我试图检查由 \ 附加的字母是否会在 C 中形成转义字符。检查这个最简单的方法是什么?

我尝试用字符集的 ASCII 附加“\”,但失败了

编辑: 我不想手动附加字符。如果我能以某种方式在 ASCII 值中进行迭代并附加然后打印以进行检查,那就太好了!

【问题讨论】:

    标签: c ascii


    【解决方案1】:

    我认为 OP 可能会感到困惑,并认为可以在 C 程序中以编程方式生成这些字符串转义序列并让它们被特殊解释(可能由printf 或由语言环境本身),例如

    char str[3] = "\";
    str[1] = 'n';
    printf(str);
    

    这是不可能。它所要做的就是打印文字字符反斜杠和字母“n”。如果您想测试转义序列是否被编译器解释,唯一的方法是写出.c 文件并在其上运行编译器。但是,转义序列集是完全标准化的,因此没有理由进行测试。只需阅读语言规范或编译器手册即可。

    【讨论】:

      【解决方案2】:

      脚本的输出:

      转义序列中允许的 ascii 字母:a、b、e、f、n、r、t、u、v、x、E、U 非转义字母:A、B、C、D、F、G、H、I、J、K、L、M、N、O、P、Q、R、S、T、V、W、 X、Y、Z、c、d、g、h、i、j、k、l、m、o、p、q、s、w、y、z

      注意:'\U''\x''\u' 本身不会形成转义序列。 \'"? 和数字不考虑,因为它们不是字母。 '\e' 仅适用于 GCC。

      这些序列是通过编译包含字符串 "\a\b...(for all ascii letters)...\z" 的 C 代码并解析编译器警告生成的:

      #!/usr/bin/env python
      import re, string, subprocess, sys
      
      def _find_non_escape_chars(compiler="cc -x c -".split(), verbose=False):
          # prepare C code to compile
          test_code = 'char *s = "%s";' % ''.join('\\'+c for c in string.ascii_letters)
          # compile it
          p = subprocess.Popen(compiler,
                               stdin=subprocess.PIPE,
                               stdout=subprocess.PIPE,
                               stderr=subprocess.STDOUT)
          stdout, _ = p.communicate(test_code)
          if verbose:
              print stdout
          # find all non-escape characters
          return set(re.findall(r"'\\(.)'", stdout))
      
      def is_escape_char(c, non_escape=_find_non_escape_chars()):
          """Whether `c` letter may be present in an escape sequence in C.
      
          >>> f = is_escape_char
          >>> f("a")
          True
          >>> f("g")
          False
          """
          return c not in non_escape
      
      def main():
          escape_chars = filter(is_escape_char, string.ascii_letters)
          print "ascii letters allowed in escape sequences:", ', '.join(escape_chars)
          print "Non-escape letters:", ', '.join(
              sorted(set(string.ascii_letters)-set(escape_chars)))
      
      if __name__=="__main__":
          import doctest; doctest.testmod()
          main()
      

      【讨论】:

        【解决方案3】:

        检查所有可能的情况怎么样?对于字母,它们是 \a、\b、\f、\n、\r、\t、\v - 不是太多...

        【讨论】:

        • 是的,我可以这样做,或者我可以查看文档。然而,挑战在于找出迭代器。
        • @KennyTM:是的,我只提到了字母,因为我认为这就是 kunjaan 所说的“一个由 \ 附加的字母”的意思。不过我可能误解了。
        • @kunjaan 那么这是不可能的,除非您为每个转义序列候选生成一个单独的 C 文件,在其上运行编译器并检查编译结果。
        猜你喜欢
        • 2022-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-08
        • 1970-01-01
        • 2021-10-04
        • 2016-05-14
        • 2022-07-01
        相关资源
        最近更新 更多