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
stringstreamy el métodogetlinepara 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++
