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