Dividir una string por algún delimitador es una tarea muy común. Por ejemplo, tenemos una lista de elementos separados por comas de un archivo y queremos elementos individuales en una array.
Casi todos los lenguajes de programación proporcionan una función para dividir una string por algún delimitador.
Cía:
// 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 <stdio.h> #include <string.h> 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\n", token); token = strtok(NULL, "-"); } return 0; }
Output: Geeks for Geeks
Complejidad del tiempo : O(n)
Espacio Auxiliar: O(n)
En 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.
Método 1: usar la API stringstream de C++
Requisito previo : API stringstream
El objeto Stringstream se puede inicializar usando un objeto de string, tokeniza automáticamente las strings en el carácter de espacio. Al igual que el flujo «cin», stringstream le permite leer una string como un flujo de palabras.
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 >> — extracts a word from the stream.
El siguiente código lo demuestra.
C++
#include <bits/stdc++.h> using namespace std; // A quick way to split strings separated via spaces. void simple_tokenizer(string s) { stringstream ss(s); string word; while (ss >> word) { cout << word << endl; } } int main(int argc, char const* argv[]) { string a = "How do you do!"; // Takes only space separated C++ strings. simple_tokenizer(a); cout << endl; return 0; }
Output : How do you do!
Método 2: Uso de las API find() y substr() de C++.
Requisito previo: función de búsqueda y substr() .
Este método es más robusto y puede analizar una string con cualquier delimitador , no solo espacios (aunque el comportamiento predeterminado es separar espacios). La lógica es bastante simple de entender a partir del código a continuación.
C++
#include <bits/stdc++.h> using namespace std; void tokenize(string s, string del = " ") { int start = 0; int end = s.find(del); while (end != -1) { cout << s.substr(start, end - start) << endl; start = end + del.size(); end = s.find(del, start); } cout << s.substr(start, end - start); } int main(int argc, char const* argv[]) { // Takes C++ string with any separator string a = "Hi$%do$%you$%do$%!"; tokenize(a, "$%"); cout << endl; return 0; }
Output: Hi do you do !
Método 3: usar una string temporal
Si se le indica que la longitud del delimitador es 1, simplemente puede usar una string temporal para dividir la string. Esto ahorrará el tiempo de sobrecarga de la función en el caso del método 2.
C++
#include <iostream> 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
Complejidad del tiempo : O(n)
Espacio Auxiliar: O(n)
En Java:
En Java, split() es un método en la clase 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); } }
Producción:
Geeks for-Geeks Geeks for Geeks
En Python:
el método split() en Python devuelve una lista de strings después de dividir la string dada por el separador especificado.
// 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 \nGeek2 \nGeek3" print(line.split()) print(line.split(' ', 1))
Producción:
['Geek1', 'Geek2', 'Geek3'] ['Geek1', '\nGeek2 \nGeek3']
Este artículo es una contribución de Aarti_Rathi y Aditya Chatterjee. Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo y enviarlo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA