2010-12-27 24 views
5

tengo una cadena. Quiero eliminar el último carácter de la cadena si es un espacio. probé el siguiente código,Eliminar un carácter de una cadena

str.erase(remove_if(str.begin(), str.end(), isspace), str.end()); 

pero mi g ++ compilador me da un error que dice:

error: no matching function for call to ‘remove_if(__gnu_cxx::__normal_iterator<char*, 
std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, 
__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, 
std::allocator<char> > >, <unresolved overloaded function type>)’ 

por favor ayuda.

+0

C++ pero el compilador es g ++ ... –

Respuesta

7

El primer problema es que isspace tiene varias sobrecargas en la Biblioteca estándar de C++. La solución inicial es proporcionar un tipo explícito para la función para que el compilador sabe qué función debe tomar la dirección de:

#include <string> 
#include <algorithm> 
#include <cctype> 

int main() 
{ 
    std::string str = "lol hi innit"; 
    str.erase(std::remove_if(str.begin(), str.end(), (int(*)(int))isspace), str.end()); 
    std::cout << str; // will output: "lolhiinnit" 
} 

Es un gran feo, pero, bueno, esto es C++.

En segundo lugar, su código eliminará todos los espacios en la cadena, que no es lo que parece querer. Considere una declaración if simple sobre el último carácter de la cadena:

#include <string> 
#include <cassert> 

int main() 
{ 
    std::string str = "lol hi innit "; 
    assert(!str.empty()); 

    if (*str.rbegin() == ' ') 
     str.resize(str.length()-1); 

    std::cout << "[" << str << "]"; // will output: "[lol hi innit]" 
} 

Espero que esto ayude.

-2

le falta algún std:: para remove_if

+0

estoy usando namespace std; –

+0

agregando std :: didnt help. –

+0

Usted ha incluido '' también? – Naveen

6

Creo que no se puede averiguar lo que es isspace (de acuerdo con el "tipo sin resolver la función sobrecargada" como tercer parámetro a remove_if en el mensaje de error). Pruebe ::isspace e incluya ctype.h

+0

yup ... que lo hizo ... –

+0

yo estaba tratando de usar std :: isspace ..: P –

+0

No he usado 'std :: isspace', pero de acuerdo con la referencia toma 2 argumentos, el segundo es la configuración regional, por lo que no cabe como un predicado – davka

0

Tuve exactamente el mismo problema que tú, así que me deshice de isspace. Acabo de ir con esto:

str.erase(std::remove_if(str.begin(),str.end(),' '),str.end()); 

que trabajó para mí con Visual C++ 2012, utilizando Visual Studio 2012. A ver si funciona para usted.

Cuestiones relacionadas