12
votes

Convertir la chaîne avec une séquence d'évacuation explicite en caractère relatif

J'ai besoin d'une fonction pour convertir des séquences d'échappement "explicites" dans le caractère relatif non imprimable. ES:

Line1

Line2


0 commentaires

5 Réponses :


0
votes

Avez-vous envisagé d'utiliser Printf? (ou un de ses proches)


3 commentaires

Comment utiliseriez-vous printf pour faire cela?


Je pense que Printf ne peut pas faire cela, car le remplacement des séquences d'échappement est effectué par le compilateur et non par Printf.


@Gnafoo: En fait, c'est le pré-processeur, si vous parlez de littéraux de chaîne. Mais c'est toujours complètement pertinent à la question, qui implique la traduction d'une chaîne {'\\', 'n'} dans une chaîne {'\ n'} .



14
votes

Je pense que vous devez écrire vous-même une telle fonction, car les caractères d'évacuation sont une fonctionnalité de compilation , c'est-à-dire lorsque vous écrivez "\ n" Le compilateur remplacerait le < Code> \ n séquence avec le caractère EOL. La chaîne résultante est de longueur 1 (à l'exclusion du caractère zéro terminateur).

Dans votre cas, une chaîne "\\ n" est de longueur 2 < / Strong> (à nouveau à l'exclusion de zéro de terminaison) et contient \ et n .

Vous devez numériser votre chaîne et lors de la rencontre \ < / Code> Vérifiez le caractère suivant. S'il s'agit de l'une des évasions légales, vous devez les remplacer par le caractère correspondant, sinon sautez ou laissez-les à la fois tel quel.

( http://ideone.com/bvcde ): xxx


4 commentaires

Enfait, je me demandais si cette fonction avait déjà été écrite.


@GLAEDR: Je suis sûr que cela a été écrit centaines de fois, mais il est trop simple de passer trop de temps à regarder. Je ferais une recherche rapide Google et si je ne trouve pas tout de suite, je l'écrirais moi-même, c'est un bon exercice. Si vous copiez le résultat à une nouvelle chaîne, il est encore plus simple, car vous n'avez pas besoin de réduire votre chaîne d'origine et vous pouvez accepter const entrée


D'accord, j'ai mis en place une fonction comme celle ci-dessus, et tout fonctionne, merci!


"C'est trop simple": ce n'est jamais simple. Lorsque vous réinventez la roue, vous brisez presque toujours la canonicalisation. Il y a toujours des fonctionnalités obscures dans les spécifications. Par exemple, comment gérerez-vous les séquences \ u Unicode ou la spécificité IO / OS \ N qui peut être détournée par le système d'exploitation, en particulier dans les flux de fichiers en mode texte ...



5
votes

Vous pouvez le faire assez facile, à l'aide de la bibliothèque d'algorithme de chaîne de boost. Par exemple: xxx

Ce n'est sûrement pas le moyen le plus efficace de le faire (car il iTère la chaîne plusieurs fois), mais il est compact et facile à comprendre.

Mettre à jour : Comme Ybungalobill en a souligné, cette implémentation se trompera, chaque fois qu'une chaîne de remplacement produit une séquence de caractères, qu'un remplacement ultérieur est la recherche ou lorsqu'un remplacement supprime / modifie une séquence de caractères, qui aurait dû être remplacée. < p> Un exemple pour le premier cas est "\\\\ n" -> "\\ n" -> "\ n" . Lorsque vous mettez le "\\\\" -> "\\" remplacement en dernier (ce qui semble être la solution à un premier coup d'œil), vous obtenez un exemple pour Ce dernier cas "\\\\ n" -> "\\\ n" . Évidemment, il n'y a pas de solution simple à ce problème, ce qui rend cette technique uniquement réalisable pour des séquences d'échappement très simples.

Si vous avez besoin d'une solution générique (et plus efficace), vous devez implémenter une machine d'état qui itière le chaîne, tel que proposé par Davka.


3 commentaires

C'est complètement faux. Escape ("\\\\\ t") retournera "\ t" au lieu de "\\ t" .


@ybungalobill Merci pour votre commentaire. J'ai mis à jour la réponse, de sorte qu'elle souligne également les limites de la technique.


Qu'en est-il de \ x?



1
votes

Je suis sûr qu'il y a, écrit par quelqu'un, mais il est si trivial que je doute que cela ait été spécifiquement publié n'importe où.

Il suffit de le recréer à partir des diverses algorithmes "Rechercher" / "Remplacer" -esque dans la bibliothèque standard.


0 commentaires

0
votes

Voici un moyen mignon de le faire sur des plates-formes Unixy.

Il appelle la commande echo du système d'exploitation pour effectuer la conversion. xxx


1 commentaires

De la même manière, vous pouvez le faire en générant un petit programme C ++ pour imprimer la chaîne, la compilation et l'exécution. Cette approche est probablement un peu plus lourde.