Vous pouvez utiliser la std::string::find()
fonction pour trouver la position de votre délimiteur de chaîne, puis utiliser std::string::substr()
pour obtenir un jeton.
Exemple:
std::string s = "scott>=tiger";
std::string delimiter = ">=";
std::string token = s.substr(0, s.find(delimiter)); // token is "scott"
La find(const string& str, size_t pos = 0)
fonction renvoie la position de la première occurrence de str
dans la chaîne, ou npos
si la chaîne n'est pas trouvée.
La substr(size_t pos = 0, size_t n = npos)
fonction renvoie une sous-chaîne de l'objet, commençant à la position pos
et à la longueur npos
.
Si vous avez plusieurs délimiteurs, après avoir extrait un jeton, vous pouvez le supprimer (délimiteur inclus) pour poursuivre les extractions suivantes (si vous souhaitez conserver la chaîne d'origine, utilisez simplement s = s.substr(pos + delimiter.length());
):
s.erase(0, s.find(delimiter) + delimiter.length());
De cette façon, vous pouvez facilement boucler pour obtenir chaque jeton.
Exemple complet
std::string s = "scott>=tiger>=mushroom";
std::string delimiter = ">=";
size_t pos = 0;
std::string token;
while ((pos = s.find(delimiter)) != std::string::npos) {
token = s.substr(0, pos);
std::cout << token << std::endl;
s.erase(0, pos + delimiter.length());
}
std::cout << s << std::endl;
Production:
scott
tiger
mushroom
size_t last = 0; size_t next = 0; while ((next = s.find(delimiter, last)) != string::npos) { cout << s.substr(last, next-last) << endl; last = next + 1; } cout << s.substr(last) << endl;
mushroom
sorties en dehors de la boucle, c'ests = mushroom
std::string token = s.substr(s.find(delimiter) + 1);
, si vous êtes sûr qu'il existe (j'utilise +1 dans la longueur) ...Cette méthode utilise
std::string::find
sans muter la chaîne d'origine en se souvenant du début et de la fin du jeton de sous-chaîne précédent.la source
Vous pouvez utiliser la fonction suivante pour fractionner la chaîne:
la source
split("abc","a")
retournera un vecteur ou une seule chaîne"bc"
, où je pense que cela aurait plus de sens s'il avait renvoyé un vecteur d'éléments["", "bc"]
. En utilisantstr.split()
Python, il était intuitif pour moi de renvoyer une chaîne vide au cas où elledelim
serait trouvée au début ou à la fin, mais c'est juste mon opinion. Quoi qu'il en soit, je pense simplement que cela devrait être mentionnéif (!token.empty())
prévention du problème mentionné par @kyriakosSt ainsi que d'autres problèmes liés aux délimiteurs consécutifs.if (!token.empty())
ne semble pas suffire à le résoudre.Pour le délimiteur de chaîne
Chaîne fractionnée basée sur un délimiteur de chaîne . Tels que le fractionnement de chaîne en
"adsf-+qwret-+nvfkbdsj-+orthdfjgh-+dfjrleih"
fonction du délimiteur de chaîne"-+"
, la sortie sera{"adsf", "qwret", "nvfkbdsj", "orthdfjgh", "dfjrleih"}
Production
Pour le délimiteur à un seul caractère
Chaîne fractionnée basée sur un délimiteur de caractères. Tels que le fractionnement de chaîne
"adsf+qwer+poui+fdgh"
avec délimiteur"+"
affichera{"adsf", "qwer", "poui", "fdg"h}
Production
la source
vector<string>
je pense que cela appellera le constructeur de copie.Ce code sépare les lignes du texte et ajoute tout le monde dans un vecteur.
Appelé par:
la source
vector<string> split(char *phrase, const string delimiter="\n")
strtok vous permet de passer plusieurs caractères comme délimiteurs. Je parie que si vous passez "> =", votre exemple de chaîne sera correctement divisé (même si les> et = sont comptés comme des délimiteurs individuels).
EDITER si vous ne voulez pas utiliser
c_str()
pour convertir de chaîne en char *, vous pouvez utiliser substr et find_first_of pour tokenize.la source
strtok()
cela m'obligerait à utiliser un tableau de caractères au lieu d'une chaîne..c_str()
est bon marché et facile aussi.Voici mon point de vue à ce sujet. Il gère les cas marginaux et prend un paramètre facultatif pour supprimer les entrées vides des résultats.
Exemples
la source
Cela devrait fonctionner parfaitement pour les délimiteurs de chaîne (ou de caractère unique). N'oubliez pas d'inclure
#include <sstream>
.La première boucle while extrait un jeton en utilisant le premier caractère du délimiteur de chaîne. La seconde boucle while ignore le reste du délimiteur et s'arrête au début du jeton suivant.
la source
J'utiliserais
boost::tokenizer
. Voici la documentation expliquant comment créer une fonction de tokenizer appropriée: http://www.boost.org/doc/libs/1_52_0/libs/tokenizer/tokenizerfunction.htmVoici celui qui fonctionne pour votre cas.
la source
La réponse est déjà là, mais la réponse sélectionnée utilise la fonction d'effacement qui est très coûteuse, pensez à une très grosse chaîne (en Mo). Par conséquent, j'utilise la fonction ci-dessous.
la source
string.split()
méthode Python .)Il s'agit d'une méthode complète qui fractionne la chaîne sur n'importe quel délimiteur et renvoie un vecteur des chaînes hachées.
C'est une adaptation de la réponse de ryanbwork. Cependant, sa vérification pour:
if(token != mystring)
donne de mauvais résultats si vous avez des éléments répétitifs dans votre chaîne. Ceci est ma solution à ce problème.la source
while (true)
fait généralement peur à voir dans un morceau de code comme celui-ci. Personnellement, je recommanderais de réécrire ceci afin que la comparaison avecstd::string::npos
(ou respectivement une vérification par rapportmystring.size()
) rendewhile (true)
obsolète.Si vous ne souhaitez pas modifier la chaîne (comme dans la réponse de Vincenzo Pii) et que vous souhaitez également afficher le dernier jeton, vous pouvez utiliser cette approche:
la source
PS: ne fonctionne que si les longueurs des chaînes après fractionnement sont égales
la source
Une fonction:
Tests unitaires:
la source
la source
la source