【发布时间】:2010-10-10 15:36:24
【问题描述】:
我试图检查由 \ 附加的字母是否会在 C 中形成转义字符。检查这个最简单的方法是什么?
我尝试用字符集的 ASCII 附加“\”,但失败了
编辑: 我不想手动附加字符。如果我能以某种方式在 ASCII 值中进行迭代并附加然后打印以进行检查,那就太好了!
【问题讨论】:
我试图检查由 \ 附加的字母是否会在 C 中形成转义字符。检查这个最简单的方法是什么?
我尝试用字符集的 ASCII 附加“\”,但失败了
编辑: 我不想手动附加字符。如果我能以某种方式在 ASCII 值中进行迭代并附加然后打印以进行检查,那就太好了!
【问题讨论】:
我认为 OP 可能会感到困惑,并认为可以在 C 程序中以编程方式生成这些字符串转义序列并让它们被特殊解释(可能由printf 或由语言环境本身),例如
char str[3] = "\";
str[1] = 'n';
printf(str);
这是不可能。它所要做的就是打印文字字符反斜杠和字母“n”。如果您想测试转义序列是否被编译器解释,唯一的方法是写出.c 文件并在其上运行编译器。但是,转义序列集是完全标准化的,因此没有理由进行测试。只需阅读语言规范或编译器手册即可。
【讨论】:
脚本的输出:
转义序列中允许的 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()
【讨论】:
检查所有可能的情况怎么样?对于字母,它们是 \a、\b、\f、\n、\r、\t、\v - 不是太多...
【讨论】: