Cómo analizar una cadena usando un delimitador en C++
-
Use los métodos
find()
ysubstr()
para parsear una cadena usando un delimitador -
Usar la clase
stringstream
y el métodogetline
para analizar la cadena usando un delimitador -
Usar el algoritmo
copy()
para analizar la cadena con un solo delimitador de espacio en blanco
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;
}
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++