Rimuovere la punteggiatura da una stringa in C++

Jinku Hu 12 ottobre 2023
  1. Usa le funzioni std::erase e std::remove_if per rimuovere la punteggiatura dalla stringa in C++
  2. Usa la funzione personalizzata per rimuovere la punteggiatura dalla stringa in C++
  3. Utilizzare il metodo iterativo per rimuovere la punteggiatura dalla stringa in C++
Rimuovere la punteggiatura da una stringa in C++

Questo articolo spiegherà diversi metodi su come rimuovere la punteggiatura da una stringa in C++.

Usa le funzioni std::erase e std::remove_if per rimuovere la punteggiatura dalla stringa in C++

std::remove_if fa parte della libreria degli algoritmi STL e può rimuovere tutti gli elementi per i quali la condizione data è vera. La condizione dovrebbe restituire il valore bool per ogni elemento nell’intervallo. In questo caso, passiamo la funzione ispunct per controllare i simboli di punteggiatura. Si noti che std::remove_if restituisce un iteratore pass-the-end per il nuovo intervallo di valori, quindi stiamo concatenando le chiamate ad esso con il metodo erase che risulta nella stringa analizzata. Questa soluzione funziona in modo simile all’idioma erase-remove.

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

int main() {
  string text =
      "Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut "
      "porttitor.";

  cout << text << endl;

  text.erase(std::remove_if(text.begin(), text.end(), ispunct), text.end());
  cout << text << endl;

  return EXIT_SUCCESS;
}

Produzione:

Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut porttitor.
Lorem ipsum dolor sit amet consectetur adipiscing elit Ut porttitor

Usa la funzione personalizzata per rimuovere la punteggiatura dalla stringa in C++

In alternativa, è possibile spostare il metodo precedente su una funzione separata, creando una copia locale della stringa data e operando su di essa restituendo il valore analizzato al codice del chiamante. Questa funzione può essere utilizzata per estendere la funzionalità per supportare diversi gruppi di caratteri o anche per passare la funzione di predicato personalizzata per il terzo parametro dell’algoritmo remove_if.

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

string removeSpaces(const string& s) {
  string tmp(s);
  tmp.erase(std::remove_if(tmp.begin(), tmp.end(), ispunct), tmp.end());
  return tmp;
}

int main() {
  string text =
      "Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut "
      "porttitor.";

  cout << text << endl;

  string parsed_text = removeSpaces(text);
  cout << parsed_text << endl;

  return EXIT_SUCCESS;
}

Produzione:

Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut porttitor.
Lorem ipsum dolor sit amet consectetur adipiscing elit Ut porttitor

Utilizzare il metodo iterativo per rimuovere la punteggiatura dalla stringa in C++

Un’altra alternativa è implementare una funzione separata che itera su ogni carattere della stringa. La funzione prende la stringa per riferimento e utilizza il cicli for per attraversare la stringa. In ogni iterazione, ispunct viene chiamato per verificare se il carattere è un simbolo di punteggiatura o meno. Si noti che, alla variabile len viene assegnata la dimensione della stringa in ogni condizione di corrispondenza perché l’oggetto stringa originale viene modificato dalla funzione erase e il bucle deve rinnovare il conteggio.

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

void removeSpaces2(string& s) {
  for (int i = 0, len = s.size(); i < len; i++) {
    if (ispunct(s[i])) {
      s.erase(i--, 1);
      len = s.size();
    }
  }
}

int main() {
  string text =
      "Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut "
      "porttitor.";

  cout << text << endl;

  removeSpaces2(text);
  cout << text << endl;

  return EXIT_SUCCESS;
}

Produzione:

Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut porttitor.
Lorem ipsum dolor sit amet consectetur adipiscing elit Ut porttitor
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