Supprimer la ponctuation d'une chaîne en C++

Jinku Hu 12 octobre 2023
  1. Utilisez les fonctions std::erase et std::remove_if pour supprimer la ponctuation d’une chaîne en C++
  2. Utiliser la fonction personnalisée pour supprimer la ponctuation de la chaîne en C++
  3. Utilisez la méthode itérative pour supprimer la ponctuation de la chaîne en C++
Supprimer la ponctuation d'une chaîne en C++

Cet article explique plusieurs méthodes pour supprimer la ponctuation d’une chaîne en C++.

Utilisez les fonctions std::erase et std::remove_if pour supprimer la ponctuation d’une chaîne en C++

std::remove_if fait partie de la bibliothèque d’algorithmes STL, et il peut supprimer tous les éléments pour lesquels la condition donnée est évaluée vraie. La condition doit renvoyer la valeur booléenne pour chaque élément de la plage. Dans ce cas, nous passons la fonction ispunct pour vérifier les symboles de ponctuation. Notez que std::remove_if renvoie un itérateur passe-fin pour la nouvelle plage de valeurs, donc nous enchaînons l’appel avec la méthode erase qui aboutit à la chaîne analysée. Cette solution fonctionne de manière similaire à l’idiome effacer-supprimer.

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

Production:

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

Utiliser la fonction personnalisée pour supprimer la ponctuation de la chaîne en C++

Alternativement, on peut déplacer la méthode précédente vers une fonction distincte, en créant une copie locale de la chaîne donnée et en opérant dessus tout en renvoyant la valeur analysée au code de l’appelant. Cette fonction peut être utilisée pour étendre la fonctionnalité pour prendre en charge différents groupes de caractères ou même passer la fonction de prédicat personnalisé pour le troisième paramètre de l’algorithme 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;
}

Production:

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

Utilisez la méthode itérative pour supprimer la ponctuation de la chaîne en C++

Une autre alternative consiste à implémenter une fonction distincte qui itère sur chaque caractère de la chaîne. La fonction prend la chaîne par référence et utilise la boucle for pour parcourir la chaîne. A chaque itération, ispunct est appelé pour vérifier si le caractère est un signe de ponctuation ou non. Notez que la variable len se voit attribuer la taille de la chaîne sur chaque condition de correspondance car l’objet chaîne d’origine est modifié par la fonction erase, et la boucle doit renouveler le décompte.

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

Production:

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

Article connexe - C++ String