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

问题描述 投票:0回答:3

我试图检查前面带有 \ 的字母表是否会在 C 中形成转义字符。检查这一点的最简单方法是什么?

我尝试在“”后面附加字符集的ASCII,但失败了

编辑

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

c ascii
3个回答
1
投票

我认为OP可能会感到困惑,并认为可以在C程序中以编程方式生成这些字符串转义序列并让它们进行特殊解释(可能由

printf
或语言环境本身),例如

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

这是不可能。它所做的只是打印文字字符反斜杠和字母“n”。如果您想测试编译器是否解释转义序列,唯一的方法是写出

.c
文件并在其上运行编译器。然而,转义序列集是完全标准化的,因此没有理由进行测试。只需阅读语言规范或编译器手册即可。


1
投票

脚本的输出:

转义序列中允许使用 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()
    

0
投票
检查所有可能的情况怎么样?对于字母来说,这些是 , , , , , , - 没有太多...

© www.soinside.com 2019 - 2024. All rights reserved.