2010-10-10 4 views
4

J'essayais de vérifier si un alphabet entouré d'un \ formerait un caractère d'échappement en C. Quelle serait la façon la plus simple de vérifier cela?Ecrivez un programme pour vérifier si un caractère forme un caractère d'échappement en C

J'ai essayé d'ajouter « \ » avec ASCII du jeu de caractères, mais il a échoué

Edit: Je ne veux pas ajouter manuellement les caractères. Si je pouvais en quelque sorte itérer dans les valeurs ASCII et ajouter puis imprimer pour vérifier, ce serait génial!

Répondre

0

Qu'en est-il de vérifier dans tous les cas possibles? Pour les lettres ce sont \ a, \ b, \ f, \ n, \ r, \ t, \ v - pas trop ...

+0

Oui je pouvais le faire ou je pourrais vérifier la documentation. Cependant, le défi consiste à comprendre l'itérateur. – unj2

+0

@KennyTM: Oui, je ne l'ai mentionné que pour les lettres car je pense que c'est ce que kunjaan voulait dire par "un alphabet entouré d'un \". Je pourrais avoir mal interprété cependant. – usta

+0

@kunjaan Ensuite, ce n'est pas possible, sauf si vous avez généré un fichier C séparé pour chaque candidat de la séquence d'échappement, que vous avez exécuté un compilateur et vérifié le résultat de la compilation. – usta

1

Je pense que OP peut être confus et pense qu'il est possible de générer par programmation ces chaînes échapper des séquences dans un programme C et les faire interpréter spécialement (peut-être par printf ou par l'environnement de langage lui-même), par ex.

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

Ceci est pas possible. Tout ce qu'il fera est d'imprimer les caractères littéraux barre oblique inverse et la lettre "n". Si vous voulez tester si une séquence d'échappement est interprétée par votre compilateur, la seule façon de le faire est d'écrire un fichier .c et d'exécuter le compilateur dessus. Cependant, l'ensemble des séquences d'échappement est complètement standardisé, il n'y a donc aucune raison de tester. Il suffit de lire la spécification de la langue ou le manuel de votre compilateur.

1

sortie du script:

 
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 

REMARQUE: '\U', '\x', '\u' par eux-mêmes ne font pas échapper à des séquences. \, ', ", ? et les chiffres ne sont pas pris en compte car ils ne sont pas alphabétiques. '\e' est uniquement GCC.

Les séquences sont produites par la compilation du code C qui contient la chaîne "\a\b...(for all ascii letters)...\z" et l'analyse syntaxique des avertissements du compilateur:

#!/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() 
Questions connexes