Напишите программу, чтобы проверить, образует ли символ escape-символ в C - PullRequest
4 голосов
/ 10 октября 2010

Я пытался проверить, будет ли алфавит, заключенный в \, образовывать escape-символ в C. Какой самый простой способ проверить это?

Я пытался добавить "\" к ASCII набора символов, но это не удалось

Редактировать: я не хочу добавлять символы вручную.Если бы я мог как-то перебрать значения ASCII и добавить, а затем распечатать для проверки, было бы здорово!

Ответы [ 3 ]

1 голос
/ 10 октября 2010

Я думаю, что OP может быть сбит с толку, и думаю, что можно программно генерировать эти escape-последовательности строк в программе на C и иметь их специальную интерпретацию (возможно, printf или самой языковой средой), например,

* 1003.*

Это невозможно .Все, что он будет делать, это напечатать обратную косую черту букв и букв «n».Если вы хотите проверить , интерпретируется ли escape-последовательность вашим компилятором, единственный способ сделать это - записать файл .c и запустить на нем компилятор.Однако набор escape-последовательностей полностью стандартизирован, поэтому нет смысла тестировать.Просто прочитайте спецификацию языка или руководство вашего компилятора.

1 голос
/ 10 октября 2010

Вывод скрипта:

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' сами по себе не образуют escape-последовательности.\, ', ", ? и цифры не учитываются, так как они не являются буквенными.'\e' только для GCC.

Последовательности создаются путем компиляции кода C, содержащего строку "\a\b...(for all ascii letters)...\z", и анализа предупреждений компилятора:

#!/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 голосов
/ 10 октября 2010

Как насчет проверки на все возможные случаи? Для букв это \ a, \ b, \ f, \ n, \ r, \ t, \ v - не слишком много ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...