At opdele en streng med en afgrænsning er en meget almindelig opgave. For eksempel har vi en kommasepareret liste over elementer fra en fil, og vi vil have individuelle elementer i et array.
Næsten alle programmeringssprog giver en funktion, der deler en streng med en afgrænser.
I 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;> }> |
>
gem youtube video vlc
>
Output: Geeks for Geeks>
Tidskompleksitet: På)
Hjælpeplads: På)
I 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.>
Metode 1: Bruger stringstream API af C++
Forudsætning : strengstrøm API
Stringstream-objekt kan initialiseres ved hjælp af et strengobjekt, det automatisk tokeniserer strenge på space char. Ligesom cin stream giver stringstream dig mulighed for at læse en streng som en strøm af ord. Alternativt kan vi også bruge getline-funktionen til at tokenisere streng på enhver enkelt tegnafgrænsning .
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>> — uddrager et ord fra strømmen.>
Koden nedenfor demonstrerer det.
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>> ord) {> >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!>
Tidskompleksitet: O(n)
Hjælpeplads:O(n)
Hvor n er længden af inputstrengen.
Metode 2: Brug af C++ find() og substr() API'er.
Forudsætning: finde funktion og substr() .
Denne metode er mere robust og kan parse en streng med en hvilken som helst afgrænsning , ikke kun mellemrum (selvom standardadfærden er at adskille på mellemrum.) Logikken er ret enkel at forstå ud fra koden nedenfor.
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;> }> |
arraylist og linkedlist
>
>
Output: How do you do !>
Tidskompleksitet: O(n)
Hjælpeplads:O(1)
Hvor n er længden af inputstrengen.
Metode 3: Brug af midlertidig streng
Hvis du får, at længden af afgrænseren er 1, så kan du blot bruge en midlertidig streng til at opdele strengen. Dette vil spare funktionen overhead-tid i tilfælde af metode 2.
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;> }> |
>
>Produktion
geeks for geeks>
Tidskompleksitet: På)
Hjælpeplads: På)
I Java:
I Java er split() en metode i String-klassen.
java-array til listen
// 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);> >}> }> |
>
>
Produktion:
Geeks for-Geeks Geeks for Geeks>
Tidskompleksitet: På)
Hjælpeplads: O(1)
I Python:
split()-metoden i Python returnerer en liste over strenge efter at have brudt den givne streng med den angivne separator.
// 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>))> |
>
>
Produktion:
['Geek1', 'Geek2', 'Geek3'] ['Geek1', ' Geek2 Geek3']>
Tidskompleksitet: O(N) , da den bare krydser gennem strengen og finder alt mellemrum.
Hjælpeplads: O(1) , da der ikke er brugt ekstra plads.