Cómo analizar una cadena usando un delimitador en C++

Jinku Hu 12 octubre 2023
  1. Use los métodos find() y substr() para parsear una cadena usando un delimitador
  2. Usar la clase stringstream y el método getline para analizar la cadena usando un delimitador
  3. Usar el algoritmo copy() para analizar la cadena con un solo delimitador de espacio en blanco
Cómo analizar una cadena usando un delimitador en C++

Este artículo explicará cómo analizar una cadena especificando un delimitador en C++.

Use los métodos find() y substr() para parsear una cadena usando un delimitador

Este método utiliza un método incorporado de find de la clase string. Toma una secuencia de caracteres para ser encontrada como un tipo string y la posición inicial como un parámetro entero. Si el método encuentra los caracteres pasados, devuelve la posición del primer carácter. En caso contrario, devuelve npos. Ponemos la sentencia find en el bucle while para iterar sobre string hasta que se encuentre el último delimitador. Para extraer una subcadena entre delimitadores, se usa la función substr, y en cada iteración, la ficha se empuja sobre un vector de words. Como último paso del bucle, eliminamos la parte procesada de la cadena con el método erase.

#include <iostream>
#include <string>
#include <vector>

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

int main() {
  string text =
      "He said. The challenge Hector heard with joy, "
      "Then with his spear restrain'd the youth of Troy ";
  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());
  }

  for (const auto &w : words) {
    cout << w << endl;
  }
  return EXIT_SUCCESS;
}

Resultado:

He
said.
The
...
Troy

Usar la clase stringstream y el método getline para analizar la cadena usando un delimitador

En esta versión, estamos poniendo la variable text en un stringstream para operar en él con el método getline. getline extrae los caracteres hasta que el char dado se encuentra y almacena el token en la variable string. Observe que este método sólo puede aplicarse cuando se necesita un único delimitador de caracteres.

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

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

int main() {
  string text =
      "He said. The challenge Hector heard with joy, "
      "Then with his spear restrain'd the youth of Troy ";
  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;
}

Usar el algoritmo copy() para analizar la cadena con un solo delimitador de espacio en blanco

copy() es un método de biblioteca <algorithm>, que puede iterar a través del rango de elementos especificados y copiarlos al rango de destino. Al principio, inicializamos una variable istringstream con el argumento text. Después de esto, utilizamos istream_iterator para hacer un bucle sobre subcadenas separadas por espacio en blanco y finalmente las enviamos a la consola. Fíjate, sin embargo, que esta solución sólo funciona si la cadena necesita ser dividida en el delimitador de espacio en blanco.

#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::vector;

int main() {
  string text =
      "He said. The challenge Hector heard with joy, "
      "Then with his spear restrain'd the youth of Troy ";

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

  return EXIT_SUCCESS;
}
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