Bevorzugte Konvertierung von char (nicht char*) nach std::string

Lesezeit: 4 Minuten

Benutzer-Avatar
pythonische Metapher

Ich habe ein chareine einfache alte Figur, die ich gerne in eine verwandeln würde std::string. std::string(char) gibt es natürlich nicht. Ich könnte ein Char-Array erstellen und es hineinkopieren, ich könnte String-Streams oder viele andere kleine Umwege durchlaufen. Aktuell bevorzuge ich boost::lexical_cast, aber selbst das scheint für diese einfache Aufgabe zu ausführlich zu sein. Was ist also der bevorzugte Weg?

std::string hat einen Konstruktor, der eine Zahl und ein Zeichen akzeptiert. Das Zeichen wird für die angegebene Anzahl von Malen wiederholt. Daher sollten Sie Folgendes verwenden:

std::string str(1, ch);

  • Dies ist die richtige Antwort. Aber was ich an diesem Konstruktor nicht mag, ist, dass ich ihn nicht oft genug verwende, um mir die Reihenfolge der Parameter zu merken. Und wenn Sie sie wechseln lassen, wird es immer noch kompiliert.

    – Fred Larson

    18. Januar 2011 um 21:10 Uhr

  • @Fred Larson Das ist mir natürlich gerade passiert, als ich diese Lösung ausprobiert habe.

    – pythonische Metapher

    18. Januar 2011 um 21:13 Uhr

  • Verwenden Sie für ein Array von Zeichen, @Maxim, den Konstruktor, der einen Zeiger und die Anzahl der Zeichen akzeptiert. In Ihrem Fall, std::string(x, 3).

    – Rob Kennedy

    18. Januar 2011 um 21:33 Uhr

  • @Rob: aber das ist ein anderer Konstruktor, ich bezog mich auf die Einschränkung des Füllkonstruktors. Du könntest es auch std::string(&ch, 1).

    – Maxim Egorushkin

    18. Januar 2011 um 21:37 Uhr

  • Schreckliche Reihenfolge der Parameter. Und warum nicht nur ein Zeichen und keinen Zählparameter zulassen?

    – Jonny

    25. Mai 2016 um 2:28 Uhr

Um die Antwort zu ergänzen, können Sie einfach die Initialisierungsliste verwenden

std::string str = {ch};

Verwenden Sie einfach die Überladung, die ein Zeichen benötigt?

dh string(1, 'A')

Benutzer-Avatar
Maxim Egorushkin

Sie können immer noch den String-Konstruktor verwenden, der zwei Iteratoren verwendet:

char c="x";
std::string(&c, &c + 1);

Aktualisieren:

Gute Frage James und GMan. Habe gerade im frei herunterladbaren “The New C Standard” von Derek M. Jones nach “pointer past” gesucht und mein erster Treffer war:

Wenn der Ausdruck P auf ein Element eines Array-Objekts und der Ausdruck Q auf das letzte Element desselben Array-Objekts zeigt, ist der Zeigerausdruck Q+1 größer als P…, obwohl Q+1 nicht auf ein zeigt Element des Array-Objekts …

Bei segmentierten Architekturen bewirkt das Inkrementieren eines Zeigers über das Ende eines Segments hinaus, dass die Adresse die segmentierte Architektur bis zum Anfang dieses Segments (normalerweise Adresse Null) umbricht. Wenn ein Array innerhalb eines solchen Segments zugewiesen wird, muss die Implementierung entweder sicherstellen, dass nach dem Array Platz für eine Eins hinter der Endadresse ist, oder sie verwendet eine andere Implementierungstechnik, um diesen Fall zu handhaben (z. B. wenn das Segment verwendet wird, ist Teil der Darstellung eines Zeigers, ein spezieller nach dem Endsegmentwert kann zugewiesen werden) …

Das relationale Operatormodell von C ermöglicht es, Zeiger auf Objekte genauso zu behandeln wie Indizes auf Array-Objekte. Relationale Vergleiche zwischen Indizes in zwei verschiedene Array-Objekte (die nicht beide Teilobjekte eines größeren Objekts sind) haben selten eine Bedeutung, und der Standard definiert keine solche Unterstützung für Zeiger. Einige Anwendungen müssen Informationen über die relativen Orte verschiedener Objekte im Speicher verwenden. Diese Verwendung wurde jedoch als nicht ausreichend allgemein nützlich angesehen, damit das Komitee ein Modell spezifizieren konnte, das das Verhalten definiert …

Die meisten Implementierungen führen keine Überprüfungen vor irgendeiner Operation an Werten durch, die einen Zeigertyp haben. Die meisten Prozessoren verwenden die gleichen Anweisungen zum Durchführen relationaler Vergleiche mit Zeigertypen wie für arithmetische Typen. Bei Prozessoren, die eine segmentierte Speicherarchitektur verwenden, wird ein Zeigerwert häufig unter Verwendung von zwei Komponenten dargestellt, einer Segmentnummer und einem Offset innerhalb dieses Segments. Eine Folge dieser Darstellung ist, dass es viele Vorteile gibt, Speicher für Objekte so zuzuweisen, dass er in ein einzelnes Segment passt (dh Speicher für ein Objekt erstreckt sich nicht über eine Segmentgrenze). Ein Vorteil ist eine Optimierung, die den generierten Maschinencode für einige der Vergleichsoperatoren einbezieht, die nur die Segment-Offset-Komponente überprüfen müssen. Dies kann dazu führen, dass p >= q falsch, aber p > q wahr ist, wenn p und q auf unterschiedliche Objekte zeigen.

Dies funktioniert auf gcc C++ 4.9.2 (http://ideone.com/f3qhTe)

#include <iostream>
using namespace std;

int main() {
    // your code goes here
    std::string test;

    test = (char) 76;
    test += (char) 77;
    test += (char) 78;
    test += (char) 79;

    std::cout << "test contains: " << test << std::endl;
    return 0;
}

1012740cookie-checkBevorzugte Konvertierung von char (nicht char*) nach std::string

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy