Dividi stringa per spazio in C++

Jinku Hu 12 ottobre 2023
  1. Usa le funzioni std::string::find e std::string::substr per dividere la stringa per spazio in C++
  2. Usa std::istringstream e std::copy per dividere la stringa per spazio in C++
  3. Usa i modi std::getline e erase-remove per dividere la stringa per spazio in C++
Dividi 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
Autore: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Articolo correlato - C++ String