Dividir cadena por espacio en C++
-
Utilice las funciones
std::string::find
ystd::string::substr
para dividir la cadena por espacio en C++ -
Utilice
std::istringstream
ystd::copy
para dividir cadena por espacio en C++ -
Utilice
std::getline
yerase-remove
Idiom para 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
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 FacebookArtículo relacionado - C++ String
- Encuentre el primer carácter repetido en una cadena en C++
- Encuentre la subcadena común más larga en C++
- Poner en mayúscula la primera letra de una cadena en C++
- Comparación de cadenas y caracteres en C++
- Eliminar el último carácter de una cadena en C++
- Obtener el último carácter de una cadena en C++