Das Aufteilen einer Zeichenfolge durch ein Trennzeichen ist eine sehr häufige Aufgabe. Wir haben beispielsweise eine durch Kommas getrennte Liste von Elementen aus einer Datei und möchten einzelne Elemente in einem Array.
Fast alle Programmiersprachen bieten eine Funktion zum Aufteilen einer Zeichenfolge durch ein Trennzeichen.
In C:
// Splits str[] according to given delimiters. // and returns next token. It needs to be called // in a loop to get all tokens. It returns NULL // when there are no more tokens. char * strtok(char str[], const char *delims);>
C
// A C/C++ program for splitting a string> // using strtok()> #include> #include> int> main()> {> >char> str[] =>'Geeks-for-Geeks'>;> >// Returns first token> >char> *token =>strtok>(str,>'-'>);> > >// Keep printing tokens while one of the> >// delimiters present in str[].> >while> (token != NULL)> >{> >printf>(>'%s
'>, token);> >token =>strtok>(NULL,>'-'>);> >}> >return> 0;> }> |
>
Rihannas Alter
>
Output: Geeks for Geeks>
Zeitkomplexität: An)
Hilfsraum: An)
In C++
Note: The main disadvantage of strtok() is that it only works for C style strings. Therefore we need to explicitly convert C++ string into a char array. Many programmers are unaware that C++ has two additional APIs which are more elegant and works with C++ string.>
Methode 1: Verwendung der Stringstream-API von C++
Voraussetzung : Stringstream API
Das Stringstream-Objekt kann automatisch mit einem String-Objekt initialisiert werden tokenisiert Zeichenfolgen auf Leerzeichen. Genau wie Cin Stream können Sie mit Stringstream einen String als Wortstrom lesen. Alternativ können wir auch die getline-Funktion verwenden, um Zeichenfolgen zu tokenisieren irgendein einzelnes Zeichentrennzeichen .
Some of the Most Common used functions of StringStream. clear() — flushes the stream str() — converts a stream of words into a C++ string object. operator <<— pushes a string object into the stream. operator>> – extrahiert ein Wort aus dem Stream.>
Der folgende Code demonstriert es.
C++
#include> using> namespace> std;> // A quick way to split strings separated via spaces.> void> simple_tokenizer(string s)> {> >stringstream ss(s);> >string word;> >while> (ss>> Wort) {> >cout << word << endl;> >}> }> // A quick way to split strings separated via any character> // delimiter.> void> adv_tokenizer(string s,>char> del)> {> >stringstream ss(s);> >string word;> >while> (!ss.eof()) {> >getline(ss, word, del);> >cout << word << endl;> >}> }> int> main(>int> argc,>char> const>* argv[])> {> >string a =>'How do you do!'>;> >string b =>'How$do$you$do!'>;> >// Takes only space separated C++ strings.> >simple_tokenizer(a);> >cout << endl;> >adv_tokenizer(b,>'$'>);> >cout << endl;> >return> 0;> }> |
>
>
Output : How do you do!>
Zeitkomplexität: O(n)
Hilfsraum:O(n)
Wobei n die Länge der Eingabezeichenfolge ist.
Methode 2: Verwenden der C++-APIs find() und substr().
Voraussetzung: Funktion finden Und substr() .
Diese Methode ist robuster und kann eine Zeichenfolge mit jedem Trennzeichen analysieren , nicht nur Leerzeichen (obwohl das Standardverhalten darin besteht, nach Leerzeichen zu trennen). Die Logik ist anhand des folgenden Codes ziemlich einfach zu verstehen.
C++
#include> using> namespace> std;> void> tokenize(string s, string del =>' '>)> {> >int> start, end = -1*del.size();> >do> {> >start = end + del.size();> >end = s.find(del, start);> >cout << s.substr(start, end - start) << endl;> >}>while> (end != -1);> }> int> main(>int> argc,>char> const>* argv[])> {> >// Takes C++ string with any separator> >string a =>'How$%do$%you$%do$%!'>;> >tokenize(a,>'$%'>);> >cout << endl;> >return> 0;> }> |
>
ist Eiweißfett
>
Output: How do you do !>
Zeitkomplexität: O(n)
Hilfsraum:O(1)
Wobei n die Länge der Eingabezeichenfolge ist.
Methode 3: Verwendung einer temporären Zeichenfolge
Wenn die Länge des Trennzeichens 1 beträgt, können Sie die Zeichenfolge einfach mit einer temporären Zeichenfolge aufteilen. Dadurch wird im Fall von Methode 2 die Funktions-Overhead-Zeit eingespart.
C++
#include> using> namespace> std;> void> split(string str,>char> del){> >// declaring temp string to store the curr 'word' upto del> >string temp =>''>;> > >for>(>int> i=0; i<(>int>)str.size(); i++){> >// If cur char is not del, then append it to the cur 'word', otherwise> >// you have completed the word, print it, and start a new word.> >if>(str[i] != del){> >temp += str[i];> >}> >else>{> >cout << temp <<>' '>;> >temp =>''>;> >}> >}> > >cout << temp;> }> int> main() {> >string str =>'geeks_for_geeks'>;>// string to be split> >char> del =>'_'>;>// delimiter around which string is to be split> > >split(str, del);> > >return> 0;> }> |
>
>Ausgabe
geeks for geeks>
Zeitkomplexität: An)
Hilfsraum: An)
In Java:
In Java ist split() eine Methode in der String-Klasse.
// expregexp is the delimiting regular expression; // limit is the number of returned strings public String[] split (String regexp, int limit); // We can call split() without limit also public String[] split (String regexp)>
Java
// A Java program for splitting a string> // using split()> import> java.io.*;> public> class> Test> {> >public> static> void> main(String args[])> >{> >String Str =>new> String(>'Geeks-for-Geeks'>);> >// Split above string in at-most two strings> >for> (String val: Str.split(>'-'>,>2>))> >System.out.println(val);> >System.out.println(>''>);> > >// Splits Str into all possible tokens> >for> (String val: Str.split(>'-'>))> >System.out.println(val);> >}> }> |
>
Welche Größe hat mein Monitorbildschirm?
>
Ausgabe:
Geeks for-Geeks Geeks for Geeks>
Zeitkomplexität: An)
Hilfsraum: O(1)
In Python:
Die Methode split() in Python gibt eine Liste von Zeichenfolgen zurück, nachdem die angegebene Zeichenfolge durch das angegebene Trennzeichen getrennt wurde.
// regexp is the delimiting regular expression; // limit is limit the number of splits to be made str. split (regexp = '', limit = string.count(str))>
Python3
line>=> 'Geek1
Geek2
Geek3'> print>(line.split())> print>(line.split(>' '>,>1>))> |
>
>
Ausgabe:
['Geek1', 'Geek2', 'Geek3'] ['Geek1', ' Geek2 Geek3']>
Zeitkomplexität: O(N) , da es nur die Zeichenfolge durchläuft und alle Leerzeichen findet.
Hilfsraum: O(1) , da kein zusätzlicher Platz genutzt wurde.