8
votes

C ++ caractère remplacer

Quelle est la meilleure façon de remplacer les caractères d'une chaîne?

Spécialement: xxx

Je veux remplacer toutes les virgules, les espaces et "|" avec des traits de soulignement.

(J'ai accès à boost.)


2 commentaires

Est-ce une chaîne de classe de classe STD :: String ou un tableau de type de type avec une terminaison \ 0 ?


Je pense que les diverses réponses remplaçantes, par ex. Onclebens, sont bons. Un commentaire général, cependant: si vous remplacez des caractères pour obtenir quelque chose de sécurité pour une utilisation par ex. En tant que nom de fichier, vous devez énumérer des caractères autorisés et remplacer tout le reste, plutôt que l'inverse. De cette façon, vous ne serez pas surpris par une entrée étrange que vous n'aviez pas pensée.


7 Réponses :


0
votes

La bibliothèque standard C ++ a accès également à ces fonctions sans utiliser de boost. Reportez-vous à la Remplacer la référence C ++ . Est-ce le meilleur moyen? Je suppose que c'est à la discussion. Pour remplacer plusieurs caractères / différents, vous devrez peut-être appeler remplacer plus d'une fois. XXX

exemple programme : xxx


3 commentaires

La méthode de remplacement remplace simplement un caractère (plage), pas toutes les occurrences de quelque chose, donc je dirais que ce n'est vraiment pas très utile pour cette tâche :)


Roger. C'est pourquoi j'ai dit qu'il doit être couru plus d'une fois. Que ce soit la meilleure méthodologie, c'est au développeur


En fait, vous pouvez rendre l'eau plus boueuse. String :: Remplacer est destiné à remplacer une seule plage avec une autre chaîne (ou caractères). OP veut remplacer uniquement les caractères uniques, donc au lieu de la méthode de remplacement de poids lourd que vous auriez pu pointer sur opérateur [], ce qui vous permet de "remplacer" la valeur des caractères simples.



3
votes

EDIT: AS SPACE_C0WB0Y a déclaré, replace_if est définitivement meilleur. Voici quelques Simple échantillon code: xxx

< Strong> Ancienne réponse:

Utilisez STD: : Remplacez avec STD :: Find_First_of


0 commentaires

11
votes

Vous pouvez utiliser l'algorithme de stl-algorithme remplacer_if .


0 commentaires

2
votes

boost :: remplaille_all (S, vieux, nouveau);


0 commentaires

9
votes

Comme les autres réponses indiquées, vous pouvez utiliser les différentes méthodes remplacer . Cependant, ces approches ont la possibilité de numériser la chaîne plusieurs fois (une fois pour chaque personnage). Je recommanderais de rouler votre propre méthode de remplacement, si vous vous souciez de la vitesse: xxx


3 commentaires

La méthode de remplacement d'une ligne est belle, mais votre solution fonctionne bien aussi


Une ligne Remplacer est définitivement plus agréable (je pense que vous aurez besoin de lignes au moins), mais ce n'est pas aussi efficace.


Je ne pense pas remplacer_if scannera la chaîne plusieurs fois.



0
votes

J'écris cela, quand space_c0wb0y a posté sa réponse, quelle est la bonne réponse à votre question. Ceci est un peu plus compliqué, mais gère plus de remplaçants possibles.

(désolé, non compilé / testé) xxx


0 commentaires

16
votes

Vous pouvez utiliser l'algorithme standard remplacer_if , à l'exception du prédicat est plutôt compliqué (à être exprimé en ligne avec la norme C ++ actuelle et sans lambda).

Vous pouvez écrire votre propre ou utiliser < Code> is_any_of dans les algorithmes de chaîne de Boost, donc: xxx


0 commentaires