Analizza stringa utilizzando un delimitatore in C++
-
Usa i metodi
find()
esubstr()
per analizzare la stringa usando un delimitatore -
Usa la classe
stringstream
e il metodogetline
per analizzare la stringa usando un delimitatore -
Usa la funzione
copy()
per analizzare la stringa con un singolo delimitatore di spazio bianco
Questo articolo spiegherà come analizzare una stringa specificando un delimitatore in C++.
Usa i metodi find()
e substr()
per analizzare la stringa usando un delimitatore
Questo metodo utilizza un metodo find
incorporato della classe string
. Ci vuole una sequenza di caratteri per essere trovata come tipo stringa
e la posizione iniziale come parametro intero. Se il metodo trova i caratteri passati, restituisce la posizione del primo carattere. In caso contrario, restituisce npos
. Mettiamo l’istruzione find
nel cicli while
per iterare su stringa
finché non viene trovato l’ultimo delimitatore. Per estrarre una sottostringa tra delimitatori, viene utilizzata la funzione substr
e ad ogni iterazione il token viene inserito in un vettore di words
. Come ultimo passo del bucle, rimuoviamo la parte processata della stringa con il metodo delete
.
#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;
}
Produzione:
He
said.
The
...
Troy
Usa la classe stringstream
e il metodo getline
per analizzare la stringa usando un delimitatore
In questo metodo, stiamo inserendo la variabile stringa text
in uno stringstream
per operare su di essa con il metodo getline
. getline
estrae i caratteri finché non viene trovato il dato char
e memorizza il token nella variabile string
. Si noti che questo metodo può essere applicato solo quando è necessario un delimitatore di carattere singolo.
#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;
}
Usa la funzione copy()
per analizzare la stringa con un singolo delimitatore di spazio bianco
copy()
è una funzione di libreria <algorithm>
, che può iterare attraverso l’intervallo di elementi specificato e copiarli nell’intervallo di destinazione. All’inizio inizializziamo una variabile istringstream
con l’argomento text
. Dopodiché, utilizziamo istream_iterator
per eseguire il bucle su sottostringhe separate da spazi e infine inviarle alla console. Si noti, tuttavia, che questa soluzione funziona solo se la stringa
deve essere divisa sul delimitatore di spazi.
#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 Facebook