我试图检查前面带有 \ 的字母表是否会在 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()