1006 Stimmen

Wie konvertiert man eine Instanz von std::string in Kleinbuchstaben?

Ich möchte eine std::string zu Kleinbuchstaben. Die Funktion ist mir bekannt tolower() . In der Vergangenheit hatte ich jedoch Probleme mit dieser Funktion, und sie ist ohnehin nicht ideal, da sie mit einer std::string würde eine Iteration über jedes Zeichen erfordern.

Gibt es eine Alternative, die zu 100 % funktioniert?

33voto

Patrick Ohly Punkte 684

Wenn die Zeichenkette UTF-8-Zeichen außerhalb des ASCII-Bereichs enthält, werden diese von boost::algorithm::to_lower nicht umgewandelt. Verwenden Sie besser boost::locale::to_lower, wenn UTF-8 beteiligt ist. Siehe http://www.boost.org/doc/libs/1_51_0/libs/locale/doc/html/conversions.html

28voto

user2218467 Punkte 237

Dies ist eine Fortsetzung der Antwort von Stefan Mai: Wenn Sie das Ergebnis der Konvertierung in einer anderen Zeichenkette ablegen möchten, müssen Sie den Speicherplatz vor dem Aufruf von std::transform . Da die STL transformierte Zeichen im Ziel-Iterator speichert (und diesen bei jeder Iteration der Schleife erhöht), wird die Größe der Zielzeichenkette nicht automatisch angepasst, und es besteht die Gefahr, dass der Speicher überlastet wird.

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

int main (int argc, char* argv[])
{
  std::string sourceString = "Abc";
  std::string destinationString;

  // Allocate the destination space
  destinationString.resize(sourceString.size());

  // Convert the source string to lower case
  // storing the result in destination string
  std::transform(sourceString.begin(),
                 sourceString.end(),
                 destinationString.begin(),
                 ::tolower);

  // Output the result of the conversion
  std::cout << sourceString
            << " -> "
            << destinationString
            << std::endl;
}

10voto

Atul Rokade Punkte 148

Der einfachste Weg, eine Zeichenkette in Kleinbuchstaben umzuwandeln, ohne sich um den std-Namensraum zu kümmern, ist der folgende

1:String mit/ohne Leerzeichen

#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
int main(){
    string str;
    getline(cin,str);
//------------function to convert string into lowercase---------------
    transform(str.begin(), str.end(), str.begin(), ::tolower);
//--------------------------------------------------------------------
    cout<<str;
    return 0;
}

2:String ohne Leerzeichen

#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
int main(){
    string str;
    cin>>str;
//------------function to convert string into lowercase---------------
    transform(str.begin(), str.end(), str.begin(), ::tolower);
//--------------------------------------------------------------------
    cout<<str;
    return 0;
}

7voto

A-Sharabiani Punkte 15310

Ich habe diese einfache Hilfsfunktion geschrieben:

#include <locale> // tolower

string to_lower(string s) {        
    for(char &c : s)
        c = tolower(c);
    return s;
}

Verwendung:

string s = "TEST";
cout << to_lower("HELLO WORLD"); // output: "hello word"
cout << to_lower(s); // won't change the original variable.

6voto

TarmoPikaro Punkte 4208

Meine eigenen Vorlagenfunktionen, die Groß-/Kleinschreibung durchführen.

#include <string>
#include <algorithm>

//
//  Lowercases string
//
template <typename T>
std::basic_string<T> lowercase(const std::basic_string<T>& s)
{
    std::basic_string<T> s2 = s;
    std::transform(s2.begin(), s2.end(), s2.begin(), tolower);
    return s2;
}

//
// Uppercases string
//
template <typename T>
std::basic_string<T> uppercase(const std::basic_string<T>& s)
{
    std::basic_string<T> s2 = s;
    std::transform(s2.begin(), s2.end(), s2.begin(), toupper);
    return s2;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X