Een tekenreeks in C++ ontleden (splitsen) met behulp van een tekenreeksscheidingsteken (standaard C++)
Ik ben een string aan het ontleden in C++ met het volgende:
string parsed,input="text to be parsed";
stringstream input_stringstream(input);
if(getline(input_stringstream,parsed,' '))
{
// do some processing.
}
Parseren met een enkel char scheidingsteken gaat prima. Maar wat als ik een string als scheidingsteken wil gebruiken.
Voorbeeld: Ik wil splitsen:
scott>=tiger
met >= als scheidingsteken, zodat ik scott en tiger krijg.
304
3
Je kunt de [
std::string::find()
][1] functie gebruiken om de positie van je string scheidingsteken te vinden, gebruik dan [std::string::substr()
][2] om een token te krijgen.Voorbeeld:
De
find(const string& str, size_t pos = 0)
functie geeft de positie van het eerste voorkomen vanstr
in de string terug, of [npos
][3] als de string niet gevonden is.De
substr(size_t pos = 0, size_t n = npos)
functie retourneert een substring van het object, beginnend op positiepos
en met lengtenpos
.Als je meerdere delimiters hebt, kun je nadat je een token hebt geëxtraheerd, deze verwijderen (inclusief delimiter) om verder te gaan met volgende extracties (als je de originele string wilt behouden, gebruik dan
s = s.substr(pos + delimiter.length());
):Op deze manier kun je gemakkelijk een lus maken om elk token te krijgen.
Volledig voorbeeld
strtok staat je toe om meerdere tekens als scheidingstekens in te voeren. Ik wed dat als je ">=" zou invoeren, je voorbeeldstring correct zou worden gesplitst (ook al worden de > en = geteld als individuele scheidingstekens).
EDIT als je
c_str()
niet wilt gebruiken om van string naar char* te converteren, kun je substr en find_first_of gebruiken om te tokenize.Ik zou
boost::tokenizer
gebruiken. Hier's documentatie die uitlegt hoe je een geschikte tokenizer functie maakt: http://www.boost.org/doc/libs/1_52_0/libs/tokenizer/tokenizerfunction.htmHier's een die werkt voor uw geval.