Analizza una sequenza di stringhe separate da virgole in C++

Jinku Hu 12 ottobre 2023
  1. Usa le funzioni std::string::find e std::string::erase per analizzare la sequenza di stringhe separate da virgole in C++
  2. Usa la funzione std::getline per analizzare la sequenza di stringhe separate da virgole
Analizza una sequenza di stringhe separate da virgole in C++

Questo articolo illustrerà più metodi su come analizzare una sequenza di stringhe separate da virgole in C++.

Usa le funzioni std::string::find e std::string::erase per analizzare la sequenza di stringhe separate da virgole in C++

Il metodo std::find è una funzione incorporata della classe std::string e può essere utilizzato per trovare la posizione della sottostringa data. In questo caso è necessario un singolo argomento che denota la sottostringa da trovare. Qualsiasi variabile stringa multi-carattere può essere inizializzata per essere passata come argomento. Sebbene, nel seguente esempio, dichiariamo una singola virgola contenente stringa. Poiché il metodo find restituisce la posizione della sottostringa e string::npos quando la sottostringa non viene trovata, possiamo mettere l’espressione di confronto in un cicli while che verrà eseguito fino a quando l’espressione non sarà considerata vera.

Memorizziamo anche la stringa analizzata ad ogni iterazione nel contenitore vector. Quindi, viene chiamato il metodo erase per eliminare i caratteri prima e incluso il primo delimitatore di virgola trovato per continuare a elaborare lo stesso oggetto stringa nell’iterazione successiva. Infine, inviamo gli elementi memorizzati nel vettore al flusso cout.

#include <algorithm>
#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 = "1,2,3,4,5,6,7,8,9,10";
  string delimiter = ",";
  vector<string> words{};

  size_t pos = 0;
  while ((pos = text.find(delimiter)) != string::npos) {
    words.push_back(text.substr(0, pos));
    text.erase(0, pos + delimiter.length());
  }
  for (const auto &str : words) {
    cout << str << endl;
  }

  return EXIT_SUCCESS;
}

Produzione:

1
2
3
4
5
6
7
8
9

Usa la funzione std::getline per analizzare la sequenza di stringhe separate da virgole

La soluzione precedente non riesce a estrarre l’ultimo numero inf nella sequenza separata da virgole. Quindi potrebbe essere meglio usare il seguente metodo usando la funzione std::getline piuttosto che aggiungere un controllo condizionale nell’esempio di codice precedente. getline legge i caratteri dal flusso di input specificato e li memorizza in un oggetto stringa. La funzione accetta anche un terzo argomento opzionale per specificare il delimitatore in base al quale suddividere la stringa di input. Memorizziamo anche le stringhe estratte nel contenitore std::vector ad ogni iterazione per un uso successivo.

#include <algorithm>
#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 = "1,2,3,4,5,6,7,8,9,10";
  char delimiter = ',';
  vector<string> words{};

  stringstream sstream(text);
  string word;
  while (std::getline(sstream, word, delimiter)) {
    words.push_back(word);
  }

  for (const auto &str : words) {
    cout << str << endl;
  }

  return EXIT_SUCCESS;
}

Produzione:

1
2
3
4
5
6
7
8
9
10
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