logo

Hur delar man en sträng i C/C++, Python och Java?

Att dela en sträng med någon avgränsare är en mycket vanlig uppgift. Till exempel har vi en kommaseparerad lista med objekt från en fil och vi vill ha enskilda objekt i en array.
Nästan alla programmeringsspråk tillhandahåller en funktion som delar en sträng med någon avgränsare.

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;> }>



>

få aktuellt datum i java

>

Output: Geeks for Geeks>

Tidskomplexitet: På)

Hjälputrymme: 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.>

Metod 1: Använder stringstream API för C++

Nödvändig förutsättning : strängström API

Stringstream-objekt kan initieras med ett strängobjekt, det automatiskt tokeniserar strängar på rymdröding. Precis som cin stream låter stringstream dig läsa en sträng som en ström av ord. Alternativt kan vi också använda getline-funktionen för att tokenisera sträng på någon enskild teckenavgränsare .

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>> — extraherar ett ord från strömmen.>

Koden nedan visar 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!>

Tidskomplexitet: O(n)

Hjälputrymme:O(n)

Där n är längden på inmatningssträngen.

Metod 2: Använd C++ find() och substr() API:er.

Nödvändig förutsättning: hitta funktion och substr() .

Denna metod är mer robust och kan analysera en sträng med valfri avgränsare , inte bara mellanslag (även om standardbeteendet är att separera på mellanslag.) Logiken är ganska enkel att förstå från koden nedan.

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;> }>

>

>

Output: How do you do !>

Tidskomplexitet: O(n)

Hjälputrymme:O(1)

Där n är längden på inmatningssträngen.

Metod 3: Använd en tillfällig sträng

Om du får att längden på avgränsaren är 1, kan du helt enkelt använda en tillfällig sträng för att dela strängen. Detta kommer att spara funktionen overheadtid i fallet med metod 2.

C++


strängvändning i 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>

Tidskomplexitet: På)

Hjälputrymme: På)

I Java:
I Java är split() en metod i klassen String.

// 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);> >}> }>

>

osi referensmodell i nätverk

>

Produktion:

Geeks for-Geeks Geeks for Geeks>

Tidskomplexitet: På)
Hjälputrymme: O(1)

I Python:
Metoden split() i Python returnerar en lista med strängar efter att ha brutit den givna strängen med den angivna avgränsaren.

 // 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']>

Tidskomplexitet: O(N) , eftersom det bara går genom strängen och hittar alla blanksteg.

Hjälputrymme: O(1) , eftersom inget extra utrymme har använts.