我试图检查一个字母所围绕的字母是否会在C中形成一个转义字符。检查这个的最简单的方法是什么?
我试图用字符集的ASCII附加“\”但是它失败了
编辑: 我不想手动追加字符。如果我能以某种方式在ASCII值内迭代并附加然后打印以进行检查,那就太棒了!
答案 0 :(得分:1)
我认为OP可能会混淆并且认为可以在C程序中以编程方式生成这些字符串转义序列并让它们被特别解释(可能由printf
或语言环境本身),例如
char str[3] = "\";
str[1] = 'n';
printf(str);
不可能。它所要做的就是打印文字字符反斜杠和字母“n”。如果您想 test 编译器是否解释了转义序列,那么执行此操作的唯一方法是写出.c
文件并在其上运行编译器。但是,转义序列集完全标准化,因此没有理由进行测试。只需阅读语言规范或编译器手册即可。
答案 1 :(得分:1)
脚本输出:
ascii letters allowed in escape sequences: a, b, e, f, n, r, t, u, v, x, E, U Non-escape letters: 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()
答案 2 :(得分:0)
如何检查所有可能的案件?对于那些是\ a,\ b,\ f,\ n,\ r,\ t,\ _的字母 - 不要太多......