IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Séquences d'échappements, interprétation à l'exécution.


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut Séquences d'échappements, interprétation à l'exécution.
    Salut,

    Je voudrais savoir si vous connaissez une méthode élégante et rapide (peut être déjà incluse dans la SL), ou une option de compilation, qui permettrait d'interpréter dynamiquement n'importe quelles chaines de caractères comme le ferait le préprocesseur, je pense notamment aux séquences de saut de ligne "\n", de tabulation "\t" et consoeur sans que je code moi même une phase de remplacement de chaque séquence par le caractère correspondant à coup de str::replace ou quelque chose du genre.

    Merci.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    À ma connaissance, il n'y en a pas dans le standard.

    En plus, les séquences d'échappement C/C++ sont mal pensées car elles ne sont pas un code déchiffrable: Une séquence d'échappement numérique ne peut pas être suivie d'un chiffre par exemple (car il sera considéré comme en faisant partie). Au moins en C# ils ont corrigé ça.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    Merci,

    d'ailleurs moi même j'ai toujours trouvé le c++ très bancal.

    Celà dit, est-ce que tu vois une autre piste pour faire cela très vite sans utiliser les regexpressions de Boost, en faisant les remplacements en une seule passe, ou dois-je en venir à une boucle et traiter chaque caractère séparément ?

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pour moi, la seule façon de le faire en une seule passe, c'est traiter chaque caractère séparément.

    Le bon côté des choses, c'est qu'il doit être en plus possible de le faire en in-place.

    Je verrais donc un truc du genre (pardonne le C):
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    char* unescape(char *dst, char const *src)
    {
    	int end = 0;
    	size_t iDst = 0;
    	for(size_t iSrc=0 ; src[iSrc]!='\0' && !end ; iSrc++)
    	{
    		if(src[iSrc] != '\\')
    		{
    			dst[iDst++] = src[iSrc];
    			continue;
    		}
     
    		iSrc++;
    		switch(src[iSrc])
    		{
    		case '\0': /*Peut-être signaler une erreur? Je ne sais pas.*/
    			end = 1;
    			break;
    		case '\\': dst[iDst++] = '\\'; break;
    		case 'r': dst[iDst++] = '\r'; break;
    		case 'n': dst[iDst++] = '\n'; break;
    		/*même chose pour \a, \b, etc.*/
    		case '0':
    			/*Un Boucle pour lire les chiffres en octal*/
    			break;
    		case 'x':
    			/*Un Boucle pour lire les chiffres en hexa*/
    			break;
    		default:
    			/*Erreur? On ignore? On copie juste?*/
    		}
    	}
     
    	dst[iDst++] = '\0';
    	return dst;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    Parfait. On va faire comme ça alors...

    Merci pour tout Médinoc.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Une précision pour l'octal et l'hexa: Pense a rajouter des conditions de sortie sur \0, comme je l'ai fait pour la boucle principale.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Séquence d'échappement sous Delphi
    Par chahinerue6 dans le forum Langage
    Réponses: 2
    Dernier message: 29/04/2010, 23h50
  2. Interpréter les séquences d'échappement
    Par Invité dans le forum Windows Vista
    Réponses: 16
    Dernier message: 10/03/2010, 00h47
  3. Séquence d'échappement et redirection de flux
    Par Metalspy dans le forum Linux
    Réponses: 4
    Dernier message: 27/07/2009, 22h31
  4. Séquences d'échappement en runtime
    Par saragaglia dans le forum Bibliothèque standard
    Réponses: 3
    Dernier message: 30/10/2008, 09h49
  5. [Prolog+LaTeX] Séquence d'échappement inconnue
    Par jpsegret dans le forum Prolog
    Réponses: 1
    Dernier message: 01/11/2007, 14h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo