Cómo tokenizar una cadena en C++

Jinku Hu 12 octubre 2023
  1. Usar las funciones find y substr para hacer un token a una cadena en C++
  2. Usa las funciones std::stringstream y getline para hacer un token a una cadena en C++
  3. Usa el algoritmo istringstream y copy para ingerir una cadena en C++
Cómo tokenizar una cadena en C++

Este artículo explicará varios métodos de cómo tokenizar una cadena en C++.

Usar las funciones find y substr para hacer un token a una cadena en C++

La clase std::string tiene una función find incorporada para buscar una secuencia de caracteres en un objeto string dado. La función find devuelve la posición del primer carácter encontrado en la cadena y devuelve npos si no se encuentra. La llamada a la función find se inserta en la sentencia if para iterar sobre la cadena hasta que se extrae el último token de la cadena.

Note que un usuario puede especificar cualquier delimitador de tipo string y pasarlo al método find. Los tokens son empujados al vector de las cadenas y la parte ya procesada es eliminada con la función erase() en cada iteración.

#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

string text = "Think you are escaping and run into yourself.";
int main() {
  string delim = " ";
  vector<string> words{};

  size_t pos = 0;
  while ((pos = text.find(delim)) != string::npos) {
    words.push_back(text.substr(0, pos));
    text.erase(0, pos + delim.length());
  }
  if (!text.empty()) words.push_back(text.substr(0, pos));
  for (const auto &str : words) {
    cout << str << endl;
  }

  return EXIT_SUCCESS;
}

Resultado:

Think
you
are
escaping
and
run
into
yourself.

Usa las funciones std::stringstream y getline para hacer un token a una cadena en C++

stringstream puede ser utilizado para ingerir una cadena para ser procesada y usar getline para extraer fichas hasta que se encuentre el delimitador dado. Nótese que este método sólo funciona con delimitadores de un solo carácter.

#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::istringstream;
using std::string;
using std::stringstream;
using std::vector;

int main() {
  string text = "Think you are escaping and run into yourself.";
  char del = ' ';
  vector<string> words{};

  stringstream sstream(text);
  string word;
  while (std::getline(sstream, word, del)) words.push_back(word);

  for (const auto &str : words) {
    cout << str << endl;
  }

  return EXIT_SUCCESS;
}

Resultado:

Think
you
are
escaping
and
run
into
yourself.

Usa el algoritmo istringstream y copy para ingerir una cadena en C++

Alternativamente, podemos usar la función copy del encabezado <algorithm> y extraer fichas de cadena en delimitadores de espacios en blanco. En el siguiente ejemplo, sólo iteramos y enviamos los tokens de cadena a la salida estándar. Para procesar la cadena con el método copy, la insertamos en istringstream y utilizamos sus iteradores.

#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::istringstream;
using std::string;
using std::stringstream;
using std::vector;

int main() {
  string text = "Think you are escaping and run into yourself.";
  string delim = " ";
  vector<string> words{};

  istringstream iss(text);
  copy(std::istream_iterator<string>(iss), std::istream_iterator<string>(),
       std::ostream_iterator<string>(cout, "\n"));

  return EXIT_SUCCESS;
}

Resultado:

Think
you
are
escaping
and
run
into
yourself.
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - C++ String