¿Cómo dividir una string en C/C++, Python y Java?

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;
}
Producción

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *