2010-12-27 24 views
5

Ho una stringa. Voglio eliminare l'ultimo carattere della stringa se si tratta di uno spazio. Ho provato il seguente codice,Rimozione di un carattere da una stringa

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

ma il mio compilatore g ++ mi dà un errore che 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>)’ 

prega di aiuto.

+0

C++ ma il compilatore è g ++ ... –

risposta

7

Il primo problema è che isspace ha più sovraccarichi nella libreria standard C++. La correzione iniziale è quello di fornire un tipo esplicito per la funzione in modo che il compilatore sa che funzionano a prendere l'indirizzo:

#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" 
} 

E 'un grande brutto ma, hey, questo è C++.

In secondo luogo, il codice rimuoverà tutti gli spazi nella stringa, che non è quello che sembra. Considera una semplice istruzione if sull'ultimo carattere della stringa:

#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]" 
} 

Spero che questo aiuti.

-2

Vi manca un std:: per remove_if

+0

sto usando namespace std; –

+0

aggiungendo std :: didnt help. –

+0

Hai incluso anche ''? – Naveen

6

penso che non riesco a capire cosa isspace è (secondo il "tipo di funzione sovraccaricata irrisolto", come un terzo parametro per remove_if nel messaggio di errore). Prova ::isspace e includi ctype.h

+0

sì ... che ha fatto ... –

+0

stavo cercando di usare std :: isspace ..: P –

+0

Non ho usato 'std :: isspace', ma secondo il riferimento ci vogliono 2 argomenti, il secondo è la locale, quindi non si adatta come un predicato – davka

0

Ho avuto esattamente lo stesso problema di te, quindi mi sono liberato di isspace. Ho appena andato con questo:

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

che ha funzionato per me con Visual C++ 2012, utilizzando Visual Studio 2012. vedere se funziona per voi.

Problemi correlati