写一个程序来检查一个字符是否构成C中的转义字符

xpcnnkqh  于 2023-10-16  发布在  其他
关注(0)|答案(3)|浏览(67)

我试着检查一个前缀为\的字母表是否能在C中形成一个转义字符。最简单的检查方法是什么?
我尝试使用字符集的ASCII附加“”,但失败

编辑

我不想手动添加字符。如果我能以某种方式在ASCII值中插入并追加,然后打印检查,那就太好了!

xv8emn3q

xv8emn3q1#

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

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

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

ldfqzlk8

ldfqzlk82#

脚本的输出:

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()
frebpwbc

frebpwbc3#

那检查所有可能的案件呢字母有\a、\B、\f、\n、\r、\t、\v --不太多.

相关问题