HOWTO · C++
Remover pontuação de uma string em C++
Este artigo demonstra como remover a pontuação de uma string em C++
Nesta página
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