Namensräume
Varianten
Aktionen

std::strxfrm

Von cppreference.com
< cpp‎ | string‎ | byte
 
 
 
 
Definiert in Header <cstring>
std::size_t strxfrm( char* dest, const char* src, std::size_t count );

Transformiert die nullterminierte Byte-Zeichenkette, auf die src zeigt, in die implementierungsdefinierte Form, so dass der Vergleich zweier transformierter Zeichenketten mit std::strcmp dasselbe Ergebnis liefert wie der Vergleich der ursprünglichen Zeichenketten mit std::strcoll, in der aktuellen C-Locale.

Die ersten count Zeichen der transformierten Zeichenkette werden in das Ziel geschrieben, einschließlich des terminierenden Nullzeichens, und die Länge der vollständigen transformierten Zeichenkette wird zurückgegeben, ausgenommen des terminierenden Nullzeichens.

Das Verhalten ist undefiniert, wenn das dest-Array nicht groß genug ist. Das Verhalten ist undefiniert, wenn dest und src sich überlappen.

Wenn count 0 ist, dann darf dest ein Nullzeiger sein.

Inhalt

[edit] Hinweise

Die korrekte Länge des Puffers, der die gesamte transformierte Zeichenkette aufnehmen kann, ist 1 + std::strxfrm(nullptr, src, 0).

Diese Funktion wird verwendet, wenn mehrere Locale-abhängige Vergleiche mit derselben Zeichenkette oder einem Satz von Zeichenketten durchgeführt werden, da es effizienter ist, std::strxfrm zu verwenden, um alle Zeichenketten einmal zu transformieren und anschließend die transformierten Zeichenketten mit std::strcmp zu vergleichen.

[edit] Parameter

dest - Zeiger auf das erste Element des Arrays, in das die transformierte Zeichenkette geschrieben wird
src - Zeiger auf das erste Zeichen einer nullterminierten Byte-Zeichenkette, die transformiert werden soll
zählt - maximale Anzahl von zu schreibenden Zeichen

[edit] Rückgabewert

Die Länge der transformierten Zeichenkette, ohne das terminierende Nullzeichen.

[edit] Beispiel

#include <cassert>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <string>
 
int main()
{
    char* loc = std::setlocale(LC_COLLATE, "cs_CZ.iso88592");
    assert(loc);
 
    std::string in1 = "hrnec";
    std::string out1(1 + std::strxfrm(nullptr, in1.c_str(), 0), ' ');
    std::string in2 = "chrt";
    std::string out2(1 + std::strxfrm(nullptr, in2.c_str(), 0), ' ');
 
    std::strxfrm(&out1[0], in1.c_str(), out1.size());
    std::strxfrm(&out2[0], in2.c_str(), out2.size());
 
    std::cout << "In the Czech locale: ";
    if (out1 < out2)
        std::cout << in1 << " before " << in2 << '\n';
    else
        std::cout << in2 << " before " << in1 << '\n';
 
    std::cout << "In lexicographical comparison: ";
    if (in1 < in2)
        std::cout << in1 << " before " << in2 << '\n';
    else
        std::cout << in2 << " before " << in1 << '\n';
}

Mögliche Ausgabe

In the Czech locale: hrnec before chrt
In lexicographical comparison: chrt before hrnec

[edit] Siehe auch

transformiert eine breite Zeichenkette so, dass wcscmp dasselbe Ergebnis wie wcscoll liefert
(Funktion) [bearbeiten]
[virtuell]
transformiert eine Zeichenkette, damit die Sortierung durch einen Vergleich ersetzt werden kann
(virtual protected member function of std::collate<CharT>) [edit]
vergleicht zwei Strings gemäß der aktuellen Locale
(Funktion) [bearbeiten]
C-Dokumentation für strxfrm