Por ejemplo, un usuario ingresa un número de teléfono.
cout << "Enter phone number: ";
INPUT: (555) 555-5555
cin >> phone;
Quiero eliminar los caracteres "(", ")" y "-" de la cadena. He examinado las funciones de eliminación, búsqueda y reemplazo de cadenas, sin embargo, solo veo que funcionan según la posición.
¿Existe una función de cadena que pueda usar para pasar un carácter, "(" por ejemplo, y hacer que elimine todas las instancias dentro de una cadena?
std::remove
mueve los elementos no eliminados al frente del vector y devuelve un iterador que apunta justo más allá del último elemento no eliminado. Luegostd::erase
recorta el vector desde ese iterador hasta el final.string chars("()-");
y luego usar el.length()
método para obtener la longitud y el.at(i)
método para acceder a los caracteres :) Violín<iostream>
<algorithm>
<cstring>
Puede utilizar el
std::remove_if()
algoritmo para eliminar solo los caracteres que especifique:El
std::remove_if()
algoritmo requiere algo llamado predicado, que puede ser un puntero de función como el fragmento de arriba.También puede pasar un objeto de función (un objeto que sobrecarga el
()
operador de llamada de función ). Esto nos permite crear una solución aún más general:Puede especificar qué caracteres eliminar con la
"()- "
cadena. En el ejemplo anterior, agregué un espacio para que se eliminen los espacios, así como los paréntesis y los guiones.fuente
ispunct(int c)
remove_if () ya se ha mencionado. Pero, con C ++ 0x, puede especificar el predicado con una lambda en su lugar.
A continuación se muestra un ejemplo de eso con 3 formas diferentes de hacer el filtrado. También se incluyen versiones de "copia" de las funciones para los casos en los que está trabajando con una constante o no desea modificar el original.
fuente
Aquí hay una solución diferente para cualquier persona interesada. Utiliza el nuevo rango For en c ++ 11
fuente
str2
no se requiere inicialización. (2)str = std::move(str2)
sería más eficiente.Me temo que no existe tal miembro para std :: string, pero puede programar fácilmente ese tipo de funciones. Puede que no sea la solución más rápida, pero esto sería suficiente:
EDITAR: Al leer la respuesta a continuación, entendí que era más general, no solo para detectar dígitos. La solución anterior omitirá todos los caracteres pasados en la segunda cadena de argumentos. Por ejemplo:
Resultará en
fuente
Nota: es posible que necesite escribir en
ptr_fun<int, int>
lugar de simpleptr_fun
fuente
std::cref
ostd::function
(o lambdas).Sí, puede utilizar la función isdigit () para comprobar si hay dígitos :)
Aqui tienes:
Espero eso ayude :)
fuente
boost::is_any_of
Elimine todos los caracteres de una cadena que aparecen en otra cadena determinada:
Probado en Ubuntu 16.04, Boost 1.58.
fuente
Si tiene acceso a un compilador que admita plantillas variadas, puede usar esto:
fuente
Aquí hay otra alternativa más:
Funciona con std :: string y std :: wstring
fuente
Soy nuevo, pero algunas de las respuestas anteriores son increíblemente complicadas, así que aquí hay una alternativa.
NOTA: Siempre que 0-9 sean contiguos (que deberían ser de acuerdo con el estándar), esto debería filtrar todos los demás caracteres, excepto los números y ''. Sabiendo que 0-9 debe ser contiguo y un char es realmente un int, podemos hacer lo siguiente.
EDITAR: No noté que el póster también quería espacios, así que lo alteré ...
A continuación se muestra para filtrar los caracteres proporcionados.
fuente
Usando std :: wstring y wchar_t (requiere el encabezado Unicode ):
... inicializador de rango estático elegante siguiente; no es necesario configurar badChars2 exactamente de la misma manera. Es una exageración; más académico que cualquier otra cosa:
Lambda simple y conciso:
Elimina todos los personajes malos del teléfono
Salida: "555 5555555"
fuente
Para aquellos de ustedes que prefieren un estilo de codificación lambda más conciso y fácil de leer ...
Este ejemplo elimina todos los caracteres de espacio en blanco y no alfanuméricos de una cadena ancha. Puede mezclarlo con cualquiera de las otras funciones auxiliares de ctype.h para eliminar pruebas basadas en caracteres de aspecto complejo.
(No estoy seguro de cómo estas funciones manejarían los lenguajes CJK, así que camine suavemente allí).
Vea si no encuentra esto más fácil de entender que los ruidosos bucles C / C ++ for / iterator:
newLabel resultados después de ejecutar este código: " 1ReplenMoveRPMV "
Esto es solo académico, ya que claramente sería más preciso, conciso y eficiente combinar la lógica 'if' de lambda0 (primero para_cada ) en la única lambda1 (segundo para_cada ), si ya ha establecido qué caracteres son los "badChars" .
fuente
Muchas buenas respuestas, aquí hay otra forma de limpiar una serie de números, no eliminando caracteres, sino moviendo los números.
fuente