vocales una quitar primer obtener los especiales espacios eliminar como caracteres caracter cadena c++ string libcurl strip alphanumeric

quitar - obtener el primer caracter de una cadena c++



¿Cómo eliminar todos los caracteres no alfanuméricos de una cadena en c++? (10)

Estoy escribiendo una pieza de software y es necesario que maneje los datos que obtengo de una página web con libcurl. Cuando obtengo los datos, por alguna razón, tiene saltos de línea adicionales. Necesito encontrar una manera de permitir solo letras, números y espacios. Y elimina todo lo demás, incluidos los saltos de línea. ¿Hay alguna manera fácil de hacer esto? Gracias.


El algoritmo estándar remove_copy_if sería muy apropiado para su caso.


El siguiente código debería funcionar bien para la cadena dada s . Está utilizando las bibliotecas <algorithm> y <locale> .

std::string s("He!!llo Wo,@rld! 12 453"); s.erase(std::remove_if(s.begin(), s.end(), [](char c) { return !std::isalnum(c); }), s.end());


Escriba una función que tome un char y devuelva true si desea eliminar ese carácter o false si desea mantenerlo:

bool my_predicate(char c);

Luego use el algoritmo std::remove_if para eliminar los caracteres no deseados de la cadena:

std::string s = "my data"; s.erase(std::remove_if(s.begin(), s.end(), my_predicate), s.end());

Dependiendo de sus requisitos, puede usar uno de los predicados de la biblioteca estándar, como std::isalnum , en lugar de escribir su propio predicado (usted dijo que necesitaba hacer coincidir caracteres y espacios alfanuméricos, por lo que tal vez esto no encaja exactamente Que necesitas).

Si desea usar la función std::isalnum biblioteca estándar, necesitará una std::isalnum para desambiguar entre la función std::isalnum en el encabezado de la biblioteca estándar de C <cctype> (que es la que desea usar) y el std::isalnum en el encabezado de la Biblioteca estándar de C ++ <locale> (que no es la que desea usar, a menos que desee realizar un procesamiento de cadena específico de la configuración regional):

s.erase(std::remove_if(s.begin(), s.end(), (int(*)(int))std::isalnum), s.end());

Esto funciona igualmente bien con cualquiera de los contenedores de secuencia (incluidos std::string , std::vector y std::deque ). Este idioma se conoce comúnmente como el lenguaje "borrar / eliminar". El algoritmo std::remove_if también funcionará con matrices ordinarias. std::remove_if realiza solo una pasada sobre la secuencia, por lo que tiene una complejidad de tiempo lineal.


Lo siguiente funciona para mí.

str.erase(std::remove_if(str.begin(), str.end(), &ispunct), str.end()); str.erase(std::remove_if(str.begin(), str.end(), &isspace), str.end());


Los usos anteriores de std::isalnum no se compilarán con std::ptr_fun sin que se std::ptr_fun pasar el argumento unario ; por lo tanto, esta solución con una función lambda debe resumir la respuesta correcta:

s.erase(std::remove_if(s.begin(), s.end(), []( auto const& c ) -> bool { return !std::isalnum(c); } ), s.end());


Puede utilizar el algoritmo de eliminación-borrado de esta manera -

// Removes all punctuation s.erase( std::remove_if(s.begin(), s.end(), &ispunct), s.end());


Siempre puede hacer un ciclo y simplemente erase todos los caracteres no alfanuméricos si está usando una string .

#include <cctype> size_t i = 0; size_t len = str.length(); while(i < len){ if (!isalnum(str[i]) || str[i] == '' ''){ str.erase(i,1); len--; }else i++; }

Alguien mejor con el estándar Lib probablemente puede hacer esto sin un bucle.

Si está utilizando solo un búfer de caracteres, puede recorrer y si un carácter no es alfanumérico, desplace todos los caracteres después de uno hacia atrás (para sobrescribir el carácter ofensivo):

#include <cctype> size_t buflen = something; for (size_t i = 0; i < buflen; ++i) if (!isalnum(buf[i]) || buf[i] != '' '') memcpy(buf[i], buf[i + 1], --buflen - i);


Solo extendiendo un poco más el código de James McNellis. Su función es eliminar alnum caracteres en lugar de no alnum.

Para eliminar caracteres no alnum de una cadena. (alnum = alfabético o numérico)

  • Declare una función (isalnum devuelve 0 si se pasa char no es alnum)

    bool isNotAlnum(char c) { return isalnum(c) == 0; }

  • Y luego escribe esto

    s.erase(remove_if(s.begin(), s.end(), isNotAlnum), s.end());

entonces su cadena es sólo con caracteres de alnum.


#include <cctype> #include <string> #include <functional> std::string s = "Hello World!"; s.erase(std::remove_if(s.begin(), s.end(), std::not1(std::ptr_fun(std::isalnum)), s.end()), s.end()); std::cout << s << std::endl;

Resultados en:

"HelloWorld"

Utiliza isalnum para determinar si cada carácter es alfanumérico o no, luego usa ptr_fun para pasar la función a not1 que not1 el valor devuelto, dejándote solo con las cosas alfanuméricas que deseas.


void remove_spaces(string data) { int i=0,j=0; while(i<data.length()) { if (isalpha(data[i])) { data[i]=data[i]; i++; } else { data.erase(i,1);} } cout<<data; }