2010-12-27 30 views
5

Ich habe eine Zeichenfolge. Ich möchte das letzte Zeichen der Zeichenfolge löschen, wenn es ein Leerzeichen ist. Ich habe versucht, den folgenden Code,Entfernen eines Zeichens aus einer Zeichenfolge

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

aber mein g ++ Compiler gibt mir eine Fehlermeldung, dass:

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>)’ 

bitte helfen.

+0

C++, aber der Compiler ist g ++ ... –

Antwort

7

Das erste Problem ist, dass isspace mehrere Überladungen in der C++ - Standardbibliothek hat. Die anfängliche Lösung ist einen expliziten Typen für die Funktion zur Verfügung zu stellen, damit der Compiler weiß, welche die Adresse des zu übernehmen Funktion:

#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 ist ein großes hässlich, aber, hey, das C++.

Zweitens entfernt Ihr Code alle Leerzeichen in der Zeichenfolge, die nicht das ist, was Sie scheinen wollen. Betrachten Sie eine einfache if-Anweisung für das letzte Zeichen der Zeichenfolge:

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

Ich hoffe, dies hilft.

-2

Sie vermissen eine std:: für remove_if

+0

ich benutze Namespace std; –

+0

hinzufügen std :: hat nicht geholfen. –

+0

Sie haben auch '' 'eingeschlossen? – Naveen

6

denke ich, es nicht herausfinden kann, was isspace ist (nach dem „ungelöst überladenen Funktionstyp“ als dritter Parameter an remove_if in der Fehlermeldung). Versuchen Sie ::isspace, und enthalten Sie ctype.h

+0

yup .. das war es ... –

+0

Ich habe versucht, std :: isspace ..: P –

+0

Ich habe nicht 'std :: isspace' verwendet, aber nach der Referenz dauert es 2 Argumente, die zweite ist das Gebietsschema, also passt es nicht als Prädikat – davka

0

Ich hatte genau das gleiche Problem wie du, also habe ich isspace los. Ich ging mit diesem:

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

Das ist für mich mit Visual C++ 2012 arbeitete, Visual Studio 2012. Sehen Sie, wenn es für Sie arbeitet.

Verwandte Themen