Dividir cadena por espacio en C++

Jinku Hu 12 octubre 2023
  1. Utilice las funciones std::string::find y std::string::substr para dividir la cadena por espacio en C++
  2. Utilice std::istringstream y std::copy para dividir cadena por espacio en C++
  3. Utilice std::getline y erase-remove Idiom para dividir cadena por espacio en C++
Dividir cadena por espacio en C++

Este artículo mostrará varios métodos sobre cómo dividir cadenas por delimitadores de espacio en C++.

Utilice las funciones std::string::find y std::string::substr para dividir la cadena por espacio en C++

find y substr son funciones integradas de std::string que se pueden utilizar para dividir una cadena por cualquier delimitador especificado por el valor de la cadena o un solo carácter. La función find toma un argumento string y devuelve la posición en la que comienza la subcadena dada; de lo contrario, si no se encuentra, se devuelve string::npos. Por lo tanto, iteramos en el bucle while hasta que la función find devuelva npos. Mientras tanto, el método substr se puede utilizar para acceder a la parte de la cadena antes del delimitador, que en este caso es un carácter de espacio único y se almacena en un vector para su uso posterior. Después de eso, llamamos a la función clear para eliminar la primera secuencia, incluido el delimitador, en cuyo punto una nueva iteración puede proceder a repetir las operaciones.

#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 =
      "Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
      "Sed laoreet sem leo, in posuere orci elementum.";
  string space_delimiter = " ";
  vector<string> words{};

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

  return EXIT_SUCCESS;
}

Producción :

Lorem
ipsum
dolor
sit
amet,
consectetur
adipiscing
elit.
Sed
laoreet
sem
leo,
in
posuere
orci

Utilice std::istringstream y std::copy para dividir cadena por espacio en C++

Alternativamente, podemos reimplementar el código usando la clase istringstream, que proporciona operaciones de entrada/salida para flujos basados ​​en cadenas. Una vez que inicializamos el objeto istringstream con el valor de la cadena que debe dividirse, entonces se puede llamar al algoritmo std::copy para generar cada valor de cadena separada por espacios en la secuencia cout. Tenga en cuenta que este método solo admite la división del delimitador de espacio porque eso es lo que proporciona la implementación de la clase istringstream.

#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 =
      "Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
      "Sed laoreet sem leo, in posuere orci elementum.";
  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;
}

Utilice std::getline y erase-remove Idiom para dividir cadena por espacio en C++

Una desventaja de la solución anterior son los símbolos de puntuación almacenados con palabras analizadas. Puede resolverse con el modismo borrar-eliminar, que es esencialmente una operación de eliminación condicional para el rango dado. En este caso, llamamos a este método en cada palabra recuperada por std::getline para recortar todos los símbolos de puntuación que contiene. Tenga en cuenta que el objeto de la función ispunct se pasa como tercer argumento al algoritmo remove_if para comprobar los caracteres de puntuación.

#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 =
      "Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
      "Sed laoreet sem leo, in posuere orci elementum.";
  char space_char = ' ';
  vector<string> words{};

  stringstream sstream(text);
  string word;
  while (std::getline(sstream, word, space_char)) {
    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 :

Lorem
ipsum
dolor
sit
amet
consectetur
adipiscing
elit
Sed
laoreet
sem
leo
in
posuere
orci
elementum
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