J'ai besoin d'une fonction pour convertir des séquences d'échappement "explicites" dans le caractère relatif non imprimable. ES:
Line1 Line2
5 Réponses :
Avez-vous envisagé d'utiliser Printf? (ou un de ses proches) p>
Comment utiliseriez-vous printf code> 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'} code> dans une chaîne
{'\ n'} code>.
Je pense que vous devez écrire vous-même une telle fonction, car les caractères d'évacuation sont une fonctionnalité de compilation forte>, c'est-à-dire lorsque vous écrivez Dans votre cas, une chaîne Vous devez numériser votre chaîne et lors de la rencontre ( http://ideone.com/bvcde ): p> "\ n" code> Le compilateur remplacerait le < Code> \ n code> séquence avec le caractère EOL. La chaîne résultante est de
"\\ n" code> est de
\ code> et
n code>. p>
\ < / 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. p>
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 code> 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 ...
Vous pouvez le faire assez facile, à l'aide de la bibliothèque d'algorithme de chaîne de boost. Par exemple: 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. P> Mettre à jour em>:
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> < p> Un exemple pour le premier cas est 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. P> p> "\\\\ n" code> ->
"\\ n" code> ->
"\ n" code> . Lorsque vous mettez le
"\\\\" code> ->
"\\" code> remplacement en dernier (ce qui semble être la solution à un premier coup d'œil), vous obtenez un exemple pour Ce dernier cas
"\\\\ n" code> ->
"\\\ n" code>. É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. P>
C'est complètement faux. Escape ("\\\\\ t") code> retournera
"\ t" code> au lieu de
"\\ t" code>.
@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?
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ù. P>
Il suffit de le recréer à partir des diverses algorithmes "Rechercher" / "Remplacer" -esque dans la bibliothèque standard. P>
Voici un moyen mignon de le faire sur des plates-formes Unixy.
Il appelle la commande echo code> du système d'exploitation pour effectuer la conversion. p>
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.