Cadena dividida en C++

Jinku Hu 12 octubre 2023
  1. Utilice las funciones std::string::find y std::string::erase para dividir la cadena en C++
  2. Use std::getline y erase-remove Idiom para dividir una cadena en C++
  3. Utilice std::istringstream con std::copy y std::istream_iterator para dividir la cadena en C++
Cadena dividida en C++

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

Utilice las funciones std::string::find y std::string::erase para dividir la cadena en C++

Las funciones find y erase son miembros integrados de la clase std::string y se pueden combinar para dividir el texto en tokens delimitados por los caracteres dados. Este método se puede utilizar para dividir una cadena por cualquier subcadena declarada por el usuario o por un solo carácter. Aún así, el siguiente código de ejemplo demuestra el escenario en el que el delimitador es a. El método find devuelve una posición de la subcadena si se encuentra o string::npos si no se encuentra. Tenga en cuenta que debemos eliminar la parte procesada de la cadena más el delimitador. Por lo tanto, se llama a la función erase() para realizar esta tarea.

#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 =
      "Vivamus quis sagittis diam. "
      "Cras accumsan, dui id varius "
      "vitae tortor.";
  string delimiter = "a";
  vector<string> words{};

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

  return EXIT_SUCCESS;
}

Producción :

Viv
mus quis s
gittis di
m. Cr
s
ccums
n, dui id v
rius vit

Use std::getline y erase-remove Idiom para dividir una cadena en C++

Un método similar para resolver el problema dado es usar la función std::getline, que también puede extraer subcadenas entre el delimitador que especifica el usuario. El siguiente código de muestra divide el texto en cada carácter de espacio y almacena las cadenas extraídas en un contenedor std::vector. Sin embargo, tenga en cuenta que hay un modismo de borrar-eliminar que se utiliza para eliminar los caracteres de puntuación de las cadenas antes de que se almacenen.

#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 =
      "Vivamus quis sagittis diam. "
      "Cras accumsan, dui id varius "
      "vitae tortor.";

  vector<string> words{};
  char delimiter = ' ';

  istringstream sstream(text);
  string word;
  while (std::getline(sstream, word, delimiter)) {
    word.erase(std::remove_if(word.begin(), word.end(), ispunct), word.end());
    words.push_back(word);
  }

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

  return EXIT_SUCCESS;
}

Producción :

Vivamus
quis
sagittis
diam
Cras
accumsan
dui
id
varius
vitae
tortor

Utilice std::istringstream con std::copy y std::istream_iterator para dividir la cadena en C++

Alternativamente, se podría inicializar el objeto std::istringstream con el texto que necesita ser dividido y atravesarlo con std::istream_iterator. Tenga en cuenta que este método solo puede dividir cadenas por espacios, que es el delimitador predeterminado para istream_iterator. Finalmente, necesitamos copiar las cadenas extraídas al contenedor vector, lo cual se hace usando el algoritmo std::copy.

#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 =
      "Vivamus quis sagittis diam. "
      "Cras accumsan, dui id varius "
      "vitae tortor.";

  vector<string> words{};
  char delimiter = ' ';

  istringstream iss(text);
  copy(std::istream_iterator<string>(iss), std::istream_iterator<string>(),
       std::back_inserter(words));

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

  return EXIT_SUCCESS;
}

Producción :

Vivamus
quis
sagittis
diam.
Cras
accumsan,
dui
id
varius
vitae
tortor.
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