Rimuovere la punteggiatura da una stringa in C++
-
Usa le funzioni
std::erase
estd::remove_if
per rimuovere la punteggiatura dalla stringa in C++ - Usa la funzione personalizzata per rimuovere la punteggiatura dalla stringa in C++
- Utilizzare il metodo iterativo per rimuovere la punteggiatura dalla 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
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