Analizza stringa utilizzando un delimitatore in C++

Jinku Hu 12 ottobre 2023
  1. Usa i metodi find() e substr() per analizzare la stringa usando un delimitatore
  2. Usa la classe stringstream e il metodo getline per analizzare la stringa usando un delimitatore
  3. Usa la funzione copy() per analizzare la stringa con un singolo delimitatore di spazio bianco
Analizza stringa utilizzando un delimitatore in C++

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;
}
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