C++ suppression de la ponctuation de la Chaîne
J'ai eu une chaîne et je veux enlever tous les signes de ponctuation. Comment dois-je faire? J'ai fait quelques recherches et trouvé que les gens utilisent les ispunct() fonction (j'ai essayé), mais je ne peux pas sembler obtenir pour travailler dans mon code. Quelqu'un a des idées?
#include <string>
int main() {
string text = "this. is my string. it's here."
if (ispunct(text))
text.erase();
return 0;
}
Vous devriez vérifier tous les caractères un par un.
OriginalL'auteur NewFile | 2013-10-02
Vous devez vous connecter pour publier un commentaire.
À l'aide de l'algorithme de
remove_copy_if
:-OriginalL'auteur P0W
POW a déjà une bonne réponse si vous devez le résultat sous la forme d'une nouvelle chaîne. Cette réponse est la façon de le gérer si vous voulez une mise à jour sur place.
La première partie de la recette est
std::remove_if
, qui peut supprimer la ponctuation efficace, l'emballage de tous les non-ponctuation comme il va.Malheureusement,
std::remove_if
ne pas réduire la taille de la chaîne à la nouvelle taille. Il ne peut pas car il n'a pas accès à l'conteneur lui-même. Donc, il y a les caractères indésirables gauche dans la chaîne après les paniers résultat.Pour gérer cela,
std::remove_if
retourne un itérateur qui indique la partie de la chaîne qui est toujours nécessaire. Ceci peut être utilisé avec des chaîneserase
méthode, conduisant à la marche suivante...J'appelle cela un idiome parce que c'est une technique qui fonctionne dans de nombreuses situations. D'autres types de
string
convienterase
méthodes, etstd::remove
(et probablement quelques autres algorithmes de la bibliothèque de fonctions que j'ai oublié pour le moment) cette approche de combler les lacunes des articles à supprimer, mais en laissant le récipient de redimensionnement de l'appelant.OriginalL'auteur Steve314
Sortie
Lorsque vous supprimer un caractère, la taille de la chaîne de modifications. Il doit être mis à jour chaque fois que la suppression se produit. Et, si vous avez supprimé le caractère actuel, de sorte que le caractère suivant devient le caractère courant. Si vous n'avez pas décrémenter le compteur de la boucle, le personnage à côté du caractère de ponctuation ne sera pas vérifiée.
Vous devez inclure
<ctype.h>
ou<cctype>
.OriginalL'auteur thefourtheye
ispunct
prend unchar
valeur et non une chaîne.vous pouvez faire comme
Cela fonctionne mais c'est une lente algorithme.
tu m'as eu.
text.erase()
ne fonctionne pas.OriginalL'auteur CS Pei
Le problème ici est que ispunct() prend un argument un personnage, tandis que vous essayez d'envoyer une chaîne de caractères. Vous devriez boucle sur les éléments de la chaîne et de les effacer, chaque personnage si c'est un signe de ponctuation, comme ici:
OriginalL'auteur pippin1289
OriginalL'auteur user1233963
Une autre façon vous pourriez le faire ce serait comme suit:
Cela finit par créer une nouvelle chaîne au lieu de les effacer les caractères à partir de l'ancienne chaîne, mais il est un peu plus facile pour envelopper votre tête autour de l'utilisation de certains des plus complexes des fonctions intégrées.
OriginalL'auteur willard5991
OriginalL'auteur prsmith
Essayez d'utiliser celui-ci, il va supprimer tous les signes de ponctuation sur la chaîne dans le fichier texte oky.
str.effacer(remove_if(str.begin(), str.end(), ::ispunct), str.end());
s'il vous plaît répondre si utile
OriginalL'auteur Loshiye Sindiyo
J'ai essayé d'appliquer @Steve314 de la réponse, mais ne pouvais pas le faire fonctionner jusqu'à ce que je tombe sur cette note ici sur cppreference.com:
Par l'étude de l'exemple qu'elle donne, je suis capable de le faire fonctionner comme ceci:
OriginalL'auteur Xucong
je l'ai eu.
mais avec pour une boucle, elle fonctionne
vous devez modifier vos réponses afin de ne pas induire en erreur d'autres. Mais de plus, cela ne supprime '.'....pas tous les signes de ponctuation.
OriginalL'auteur NewFile