logo

Як розділити рядок у C/C++, Python та Java?

Розділення рядка деяким роздільником є ​​дуже поширеним завданням. Наприклад, у нас є розділений комами список елементів із файлу, і нам потрібні окремі елементи в масиві.
Майже всі мови програмування надають функцію, яка розділяє рядок певним роздільником.

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



>

фільтрація python

>

Output: Geeks for Geeks>

Часова складність: O(n)

Допоміжний простір: O(n)

У 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.>

Спосіб 1: Використання stringstream API C++

Передумова : рядковий потік API

Об'єкт Stringstream можна ініціалізувати за допомогою об'єкта string, це автоматично токенізує рядки на символі пробілу. Так само, як cin stream, stringstream дозволяє читати рядок як потік слів. Крім того, ми також можемо використати функцію getline для токенізації рядка будь-який роздільник окремого символу .

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>> — витягує слово з потоку.>

Наведений нижче код демонструє це.

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>> слово) {> >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!>

Часова складність: O(n)

Допоміжний простір: O(n)

Де n - довжина вхідного рядка.

Спосіб 2. Використання C++ find() і substr() API.

Необхідна умова: знайти функцію і substr() .

Цей метод є більш надійний і може аналізувати рядок з будь-яким роздільником , а не лише пробіли (хоча поведінка за замовчуванням полягає в розділенні пробілами.) Логіку досить просто зрозуміти з наведеного нижче коду.

C++




випадковий в 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 !>

Часова складність: O(n)

Допоміжний простір: O(1)

Де n - довжина вхідного рядка.

Спосіб 3: Використання тимчасового рядка

Якщо вам дано, що довжина роздільника дорівнює 1, ви можете просто використати тимчасовий рядок, щоб розділити рядок. Це заощадить накладний час функції у випадку методу 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;> }>

>

>

Вихід

geeks for geeks>

Часова складність: O(n)

Допоміжний простір: O(n)

У Java:
У Java split() є методом у класі 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);> >}> }>

>

>

Вихід:

Geeks for-Geeks Geeks for Geeks>

Часова складність: O(n)
Допоміжний простір: О(1)

У Python:
Метод split() у Python повертає список рядків після розбиття заданого рядка за вказаним роздільником.

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

>

перетворити рядок на числове
>

Вихід:

['Geek1', 'Geek2', 'Geek3'] ['Geek1', '
Geek2 
Geek3']>

Часова складність: O(N) , оскільки він просто проходить через рядок, знаходячи всі пробіли.

Допоміжний простір: O(1) , оскільки додатковий простір не було використано.