Par exemple, un utilisateur saisit un numéro de téléphone.
cout << "Enter phone number: ";
INPUT: (555) 555-5555
cin >> phone;
Je souhaite supprimer les caractères "(", ")" et "-" de la chaîne. J'ai regardé les fonctions de suppression, de recherche et de remplacement de chaîne, mais je vois uniquement qu'elles fonctionnent en fonction de la position.
Existe-t-il une fonction de chaîne que je peux utiliser pour passer un caractère, "(" par exemple, et lui demander de supprimer toutes les instances d'une chaîne?
std::remove
déplace les éléments non supprimés vers l'avant du vecteur et renvoie un itérateur pointant juste au-delà du dernier élément non supprimé. Puisstd::erase
coupe le vecteur de cet itérateur à la fin.string chars("()-");
puis utiliser la.length()
méthode pour obtenir la longueur et la.at(i)
méthode pour accéder aux caractères :) Fiddle fonctionnalisé - ideone.com/tAZt5I<iostream>
<algorithm>
<cstring>
Vous pouvez utiliser l'
std::remove_if()
algorithme pour supprimer uniquement les caractères que vous spécifiez:L'
std::remove_if()
algorithme nécessite quelque chose appelé un prédicat, qui peut être un pointeur de fonction comme l'extrait de code ci-dessus.Vous pouvez également passer un objet fonction (un objet qui surcharge l'
()
opérateur d' appel de fonction ). Cela nous permet de créer une solution encore plus générale:Vous pouvez spécifier les caractères à supprimer avec la
"()- "
chaîne. Dans l'exemple ci-dessus, j'ai ajouté un espace afin que les espaces soient supprimés ainsi que les parenthèses et les tirets.la source
ispunct(int c)
remove_if () a déjà été mentionné. Mais, avec C ++ 0x, vous pouvez spécifier le prédicat avec un lambda à la place.
Voici un exemple de cela avec 3 façons différentes de faire le filtrage. Les versions "copie" des fonctions sont également incluses pour les cas où vous travaillez avec un const ou que vous ne voulez pas modifier l'original.
la source
Voici une solution différente pour toute personne intéressée. Il utilise la nouvelle plage For en c ++ 11
la source
str2
initialisation n'est pas requise. (2)str = std::move(str2)
serait plus efficace.J'ai bien peur qu'il n'y ait pas un tel membre pour std :: string, mais vous pouvez facilement programmer ce genre de fonctions. Ce n'est peut-être pas la solution la plus rapide, mais cela suffirait:
EDIT: En lisant la réponse ci-dessous, j'ai compris qu'elle était plus générale, pas seulement pour détecter un chiffre. La solution ci-dessus omettra tous les caractères passés dans la deuxième chaîne d'argument. Par exemple:
Aura pour résultat
la source
Remarque: il est possible que vous ayez besoin d'écrire
ptr_fun<int, int>
plutôt que de simplementptr_fun
la source
std::cref
orstd::function
(ou lambdas).Oui, vous pouvez utiliser la fonction isdigit () pour vérifier les chiffres :)
Voici:
J'espère que ça aide :)
la source
boost::is_any_of
Supprimez tous les caractères d'une chaîne qui apparaissent dans une autre chaîne donnée:
Testé dans Ubuntu 16.04, Boost 1.58.
la source
Si vous avez accès à un compilateur prenant en charge les modèles variadiques, vous pouvez utiliser ceci:
la source
Voici encore une autre alternative:
Fonctionne avec std :: string et std :: wstring
la source
Je suis nouveau, mais certaines des réponses ci-dessus sont incroyablement compliquées, alors voici une alternative.
REMARQUE: tant que 0-9 sont contigus (ce qu'ils devraient être selon la norme), cela devrait filtrer tous les autres caractères sauf les nombres et «». Sachant que 0-9 doit être contigu et qu'un caractère est vraiment un int, nous pouvons faire ce qui suit.
EDIT: Je n'ai pas remarqué que l'affiche voulait aussi des espaces, alors je l'ai modifiée ...
Voici pour filtrer les caractères fournis.
la source
Utilisation de std :: wstring et wchar_t (nécessite l'en- tête Unicode ):
... l'initialiseur de plage statique fantaisie ensuite; pas nécessaire de configurer badChars2 exactement de la même manière. C'est exagéré; plus académique qu'autre chose:
Lambda simple et concis:
Supprime tous les mauvais caractères du téléphone
Sortie: "555 5555555"
la source
Pour ceux d'entre vous qui préfèrent un style de codage lambda plus concis et plus facile à lire ...
Cet exemple supprime tous les caractères non alphanumériques et d'espaces blancs d'une chaîne large. Vous pouvez le mélanger avec l'un des autres ctype.h fonctions d'assistance pour supprimer des tests basés sur des caractères complexes.
(Je ne sais pas comment ces fonctions géreraient les langues CJK, alors marchez doucement.)
Voyez si vous ne trouvez pas cela plus facile à comprendre que le C / C ++ bruyant pour les boucles / iterator:
newLabel résultats après l'exécution de ce code: " 1ReplenMoveRPMV "
Ceci est juste académique, car il serait clairement plus précis, concis et efficace de combiner la logique 'if' de lambda0 (premier for_each ) dans le seul lambda1 (deuxième for_each ), si vous avez déjà établi quels caractères sont les "badChars" .
la source
Beaucoup de bonnes réponses, voici une autre façon de nettoyer une chaîne de nombres, ne supprime pas les caractères mais en déplaçant les nombres.
la source