Tokenizar una string en C++

Tokenizar una string denota dividir una string con respecto a algún delimitador(es). Hay muchas formas de tokenizar una string. En este artículo se explican cuatro de ellos:

Usando flujo de string

Un stringstream asocia un objeto de string con una secuencia que le permite leer la string como si fuera una secuencia.

A continuación se muestra la implementación de C++: 

C++

// Tokenizing a string using stringstream
#include <bits/stdc++.h>
 
using namespace std;
 
int main()
{
     
    string line = "GeeksForGeeks is a must try";
     
    // Vector of string to save tokens
    vector <string> tokens;
     
    // stringstream class check1
    stringstream check1(line);
     
    string intermediate;
     
    // Tokenizing w.r.t. space ' '
    while(getline(check1, intermediate, ' '))
    {
        tokens.push_back(intermediate);
    }
     
    // Printing the token vector
    for(int i = 0; i < tokens.size(); i++)
        cout << tokens[i] << '\n';
}
Producción

GeeksForGeeks
is
a
must
try

Usando strtok()

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

A continuación se muestra la implementación de C++: 

C++

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

Geeks
for
Geeks

 

Otro ejemplo de strtok() :

C

// C code to demonstrate working of
// strtok
#include <string.h>
#include <stdio.h>
 
// Driver function
int main()
{
 // Declaration of string
    char gfg[100] = " Geeks - for - geeks - Contribute";
 
    // Declaration of delimiter
    const char s[4] = "-";
    char* tok;
 
    // Use of strtok
    // get first token
    tok = strtok(gfg, s);
 
    // Checks for delimiter
    while (tok != 0) {
        printf(" %s\n", tok);
 
        // Use of strtok
        // go through other tokens
        tok = strtok(0, s);
    }
 
    return (0);
}
Producción

  Geeks 
  for 
  geeks 
  Contribute

Usando strtok_r()

Al igual que la función strtok() en C, strtok_r() hace la misma tarea de analizar una string en una secuencia de tokens. strtok_r() es una versión reentrante de strtok().

Hay dos formas de llamar a strtok_r() 

// The third argument saveptr is a pointer to a char * 
// variable that is used internally by strtok_r() in 
// order to maintain context between successive calls
// that parse the same string.
char *strtok_r(char *str, const char *delim, char **saveptr);

A continuación se muestra un programa simple en C++ para mostrar el uso de strtok_r() : 

C++

// C/C++ program to demonstrate working of strtok_r()
// by splitting string based on space character.
#include<stdio.h>
#include<string.h>
 
int main()
{
    char str[] = "Geeks for Geeks";
    char *token;
    char *rest = str;
 
    while ((token = strtok_r(rest, " ", &rest)))
        printf("%s\n", token);
 
    return(0);
}
Producción

Geeks
for
Geeks

Usando std::sregex_token_iterator

En este método, la tokenización se realiza sobre la base de coincidencias de expresiones regulares. Mejor para casos de uso cuando se necesitan múltiples delimitadores.

A continuación se muestra un programa simple en C++ para mostrar el uso de std::sregex_token_iterator:

C++

// CPP program for above approach
#include <iostream>
#include <regex>
#include <string>
#include <vector>
 
/**
 * @brief Tokenize the given vector
   according to the regex
 * and remove the empty tokens.
 *
 * @param str
 * @param re
 * @return std::vector<std::string>
 */
std::vector<std::string> tokenize(
                     const std::string str,
                          const std::regex re)
{
    std::sregex_token_iterator it{ str.begin(),
                             str.end(), re, -1 };
    std::vector<std::string> tokenized{ it, {} };
 
    // Additional check to remove empty strings
    tokenized.erase(
        std::remove_if(tokenized.begin(),
                            tokenized.end(),
                       [](std::string const& s) {
                           return s.size() == 0;
                       }),
        tokenized.end());
 
    return tokenized;
}
 
// Driver Code
int main()
{
    const std::string str = "Break string
                   a,spaces,and,commas";
    const std::regex re(R"([\s|,]+)");
   
    // Function Call
    const std::vector<std::string> tokenized =
                           tokenize(str, re);
   
    for (std::string token : tokenized)
        std::cout << token << std::endl;
    return 0;
}
Producción

Break
string
a
spaces
and
commas

Complejidad de tiempo: O(n * d) donde n es la longitud de la string y d es el número de delimitadores.
Espacio Auxiliar: O(n)

Publicación traducida automáticamente

Artículo escrito por Rohit Thapliyal 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 *