59 votos

Cómo eliminar los caracteres de una cadena

Por ejemplo, tengo un usuario que introduce un número de teléfono.

cout << "Enter phone number: ";
INPUT: (555) 555-5555
cin >> phone;

Quiero quitar los caracteres "(", ")" y "-" de la cadena. He mirado la cadena de quitar, encontrar y reemplazar funciones, sin embargo, sólo veo que funcionan en base a la posición.

¿Hay alguna 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?

Gracias por su tiempo.

84voto

Eric Z Puntos 7160
   string str("(555) 555-5555");

   char chars[] = "()-";

   for (unsigned int i = 0; i < strlen(chars); ++i)
   {
      // you need include <algorithm> to use general algorithms like std::remove()
      str.erase (std::remove(str.begin(), str.end(), chars[i]), str.end());
   }

   // output: 555 5555555
   cout << str << endl;

28voto

In silico Puntos 30778

Quiero quitar la "(", ")", y "-" los caracteres de la cadena.

Puedes usar el std::remove_if() algoritmo para eliminar sólo los caracteres que especifique:

#include <iostream>
#include <algorithm>
#include <string>

bool IsParenthesesOrDash(char c)
{
    switch(c)
    {
    case '(':
    case ')':
    case '-':
        return true;
    default:
        return false;
    }
}

int main()
{
    std::string str("(555) 555-5555");
    str.erase(std::remove_if(str.begin(), str.end(), &IsParenthesesOrDash), str.end());
    std::cout << str << std::endl; // Expected output: 555 5555555
}

El std::remove_if() El algoritmo requiere algo llamado predicado, que puede ser un puntero de función como el recorte de arriba.

También puedes pasar un objeto de la función (un objeto que sobrecarga la llamada de función () operador). Esto nos permite crear una solución aún más general:

#include <iostream>
#include <algorithm>
#include <string>

class IsChars
{
public:
    IsChars(const char* charsToRemove) : chars(charsToRemove) {};

    bool operator()(char c)
    {
        for(const char* testChar = chars; *testChar != 0; ++testChar)
        {
            if(*testChar == c) { return true; }
        }
        return false;
    }

private:
    const char* chars;
};

int main()
{
    std::string str("(555) 555-5555");
    str.erase(std::remove_if(str.begin(), str.end(), IsChars("()- ")), str.end());
    std::cout << str << std::endl; // Expected output: 5555555555
}

Puede especificar qué caracteres desea eliminar con el "()- " de la cadena. En el ejemplo anterior añadí un espacio para que se eliminen los espacios, así como los paréntesis y los guiones.

4voto

StormByte Puntos 603

Me temo que no existe tal miembro para std::string, pero puedes programar fácilmente ese tipo de funciones. Puede que no sea la solución más rápida, pero esto sería suficiente:

std::string RemoveChars(const std::string& source, const std::string& chars) {
   std::string result="";
   for (unsigned int i=0; i<source.length(); i++) {
      bool foundany=false;
      for (unsigned int j=0; j<chars.length() && !foundany; j++) {
         foundany=(source[i]==chars[j]);
      }
      if (!foundany) {
         result+=source[i];
      }
   }
   return result;
}

Al leer la respuesta de abajo, entendí que era más general, no sólo para detectar el dígito. La solución anterior omitirá todos los caracteres pasados en la segunda cadena de argumentos. Por ejemplo:

std::string result=RemoveChars("(999)99-8765-43.87", "()-");

Resultará en

99999876543.87

4voto

ashwin911 Puntos 41

Aquí hay una solución diferente para cualquiera que esté interesado. Utiliza el nuevo rango de For en c++11

string str("(555) 555-5555");
string str2="";

for (const auto c: str){

    if(!ispunct(c)){

        str2.push_back(c);
    }
}

str = str2;
//output: 555 5555555
cout<<str<<endl;

3voto

Vern Puntos 1285

Sí, puedes usar la función isdigit() para comprobar los dígitos :)

Aquí tienes:

#include <iostream>
#include <cctype>

using namespace std;

int main(){

  char *str = "(555) 555-5555";
  int len = strlen(str);

  for (int i=0; i<len; i++){
      if (isdigit(*(str+i))){
        cout << *(str+i);
      }
  }

  cout << endl;

return 0;   
}

Espero que ayude :)

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X