Remover pontuação de uma string em C++

Jinku Hu 12 outubro 2023
  1. Use as funções std::erase e std::remove_if para remover a pontuação da string em C++
  2. Use a função personalizada para remover pontuação da string em C++
  3. Use o método iterativo para remover pontuação de string em C++
Remover pontuação de uma string em C++

Este artigo explicará vários métodos de como remover a pontuação de uma string em C++.

Use as funções std::erase e std::remove_if para remover a pontuação da string em C++

std::remove_if faz parte da biblioteca de algoritmos STL e pode remover todos os elementos para os quais a condição dada é avaliada como verdadeira. A condição deve retornar o valor bool para cada elemento no intervalo. Neste caso, passamos a função ispunct para verificar os símbolos de pontuação. Observe que std::remove_if retorna um iterador pass-the-end para o novo intervalo de valores, então estamos encadeando a chamada para ele com o método erase que resulta na string analisada. Esta solução funciona de forma semelhante ao 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;
}

Resultado:

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

Use a função personalizada para remover pontuação da string em C++

Como alternativa, pode-se mover o método anterior para uma função separada, criando uma cópia local da string dada e operando nela enquanto retorna o valor analisado para o código do chamador. Esta função pode ser utilizada para estender a funcionalidade para suportar diferentes grupos de caracteres ou até mesmo passar a função de predicado customizado para o terceiro parâmetro do 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;
}

Resultado:

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

Use o método iterativo para remover pontuação de string em C++

Outra alternativa é implementar uma função separada que itera por meio de cada caractere da string. A função pega a string por referência e utiliza o loop for para percorrer a string. Em cada iteração, ispunct é chamado para verificar se o caractere é um símbolo de pontuação ou não. Observe que, à variável len é atribuído o tamanho da string em cada condição correspondente porque o objeto string original é modificado pela função erase e o loop precisa renovar a contagem.

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

Resultado:

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

Artigo relacionado - C++ String