Dividi stringa per spazio in C++
-
Usa le funzioni
std::string::find
estd::string::substr
per dividere la stringa per spazio in C++ -
Usa
std::istringstream
estd::copy
per dividere la stringa per spazio in C++ -
Usa i modi
std::getline
eerase-remove
per dividere la stringa per spazio in C++
Questo articolo illustrerà più metodi su come dividere la stringa in base al delimitatore di spazio in C++.
Usa le funzioni std::string::find
e std::string::substr
per dividere la stringa per spazio in C++
find
e substr
sono funzioni incorporate std::string
che possono essere utilizzate per dividere la stringa con qualsiasi delimitatore specificato dal valore della stringa o da un singolo carattere. La funzione find
accetta un argomento string
e restituisce la posizione in cui inizia la sottostringa data; altrimenti, se non viene trovato, viene restituito string::npos
. Quindi, iteriamo nel cicli while
finché la funzione find
non restituisce npos
. Nel frattempo, il metodo substr
può essere utilizzato per accedere alla parte della stringa prima del delimitatore, che in questo caso è un carattere di spazio singolo e memorizzato in un vettore
per un uso successivo. Dopodiché, chiamiamo la funzione erase
per rimuovere la prima sequenza, incluso il delimitatore, a quel punto può procedere una nuova iterazione per ripetere le operazioni.
#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;
}
Produzione:
Lorem
ipsum
dolor
sit
amet,
consectetur
adipiscing
elit.
Sed
laoreet
sem
leo,
in
posuere
orci
Usa std::istringstream
e std::copy
per dividere la stringa per spazio in C++
In alternativa, possiamo reimplementare il codice usando la classe istringstream
, che fornisce operazioni di input/output per flussi basati su string
. Una volta inizializzato l’oggetto istringstream
con il valore string
che deve essere diviso, allora l’algoritmo std::copy
può essere chiamato per inviare ogni valore di stringa separato da spazi al flusso cout
. Notare che questo metodo supporta solo la suddivisione del delimitatore di spazio perché è ciò che fornisce l’implementazione della classe 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;
}
Usa i modi std::getline
e erase-remove
per dividere la stringa per spazio in C++
Uno svantaggio della soluzione precedente sono i simboli di punteggiatura memorizzati con parole analizzate. Può essere risolto con l’idioma cancella-rimuovi, che è essenzialmente un’operazione di rimozione condizionale per l’intervallo specificato. In questo caso, chiamiamo questo metodo su ogni parola recuperata da std::getline
per tagliare tutti i simboli di punteggiatura in essa contenuti. Nota che l’oggetto funzione ispunct
viene passato come terzo argomento all’algoritmo remove_if
per controllare i caratteri di punteggiatura.
#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;
}
Produzione:
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 Facebook