2014-05-01 16 views
13

Ich muss eine Zeichenfolge in C++ in Großbuchstaben konvertieren. Ich habe für eine Weile suchen und fand einen Weg, es zu tun:Wie konvertiert man eine C++ - Zeichenfolge in einen Großbuchstaben

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

using namespace std; 

int main() 
{ 
    string input; 
    cin >> input; 

    transform(input.begin(), input.end(), input.begin(), toupper); 

    cout << input; 
    return 0; 
} 

Leider ist dieses nicht funktioniert hat und ich erhielt diese Fehlermeldung:

keine passende Funktion für Aufruf von ‚Transformation (std: :. basic_string :: iterator, std :: basic_string :: iterator, std :: basic_string :: iterator,

ich andere Methoden versucht haben, die nicht funktionierte auch dies war die Nähe zu arbeiten

So. ich frage, was ich falsch mache, vielleicht ist meine Syntax schlecht oder ich muss etwas hinzufügen. Ich bin nicht sicher.

bekam ich die meisten meiner Informationen hier: http://www.cplusplus.com/forum/beginner/75634/ (die letzten zwei Stellen)

Antwort

19

Sie benötigen einen doppelten Doppelpunkt zu setzen, bevor toupper:

transform(input.begin(), input.end(), input.begin(), ::toupper); 

Erläuterung:

Es gibt zwei verschiedene toupper Funktionen:

  1. toupper im globalen Namensraum (Zugang mit ::toupper), den

    von C. kommt
  2. toupper im std Namensraum (Zugang mit std::toupper), die einfach mit einem Namen nur referenziert wird somit nicht mehrere Überlastungen und kann. Sie müssen es explizit um eine bestimmte Funktion Signatur gegossen referenziert zu werden, aber der Code einen Funktionszeiger für das Erhalten sieht hässlich aus: static_cast<int (*)(int)>(&std::toupper)

Da du bist using namespace std, wenn toupper, 2. versteckt Schreiben 1 und wird entsprechend den Namensauflösungsregeln gewählt.

+3

Oder loswerden der 'using namespace std erhalten;' ... –

+0

ich denke, das wäre zu arbeiten. BTW dankt den Jungs, dass sie mir geholfen haben, dieses lästige Problem zu lösen, das ich seit einiger Zeit beheben wollte. –

+0

@LokiAstari: Der Punkt ist, dass Sie die globale 'toupper', nicht die' std :: 'one (s) wollen, die das Problem mit' namespace std verwenden 'hervorhebt - es verschmutzt den Standard-Namespace mit vielen Symbolen Sie Ich will nicht nur ein oder zwei bekommen.Wenn Sie nur ein paar Symbole importieren möchten, sollten Sie nur diese Symbole importieren, nicht den gesamten 'std'-Namespace. –

5

Boost-String-Algorithmen:

#include <boost/algorithm/string.hpp> 
#include <string> 

std::string str = "Hello World"; 

boost::to_upper(str); 

std::string newstr = boost::to_upper_copy("Hello World"); 

Convert a String In C++ To Upper Case

4

Versuchen Sie dieses kleine Programm, direkt aus C++ reference

#include <iostream> 
#include <algorithm> 
#include <string> 
#include <functional> 
#include <cctype> 

using namespace std; 

int main() 
{ 
    string s; 
    cin >> s; 
    std::transform(s.begin(), s.end(), s.begin(), std::ptr_fun<int, int>(std::toupper)); 
    cout << s; 
    return 0; 

} 

Live demo

0

Sie könnten tun:

string name = "john doe"; //or just get string from user... 
for(int i = 0; i < name.size(); i++) { 
    name.at(i) = toupper(name.at(i)); 
} 
Verwandte Themen