Wie stringstream-Inhalte in char-Typ anstatt String-Typ eingefügt werden

7

Jeder weiß stringstream.str() benötigt einen String-Variablentyp, um den Inhalt von stringstream.str() darin zu speichern.

Ich möchte den Inhalt von stringstream.str() in eine char-Variable oder ein char-Array oder einen Zeiger speichern.

Ist das möglich?

Bitte schreiben Sie ein einfaches Beispiel mit Antwort.

    
Lion King 06.01.2012, 22:56
quelle

3 Antworten

12

Warum nicht einfach

%Vor%

?

Bearbeiten: Beachten Sie, dass Sie p nicht frei von Ihrer Funktion angeben können: Ihre Lebensdauer ist an die Lebensdauer von s gebunden, daher sollten Sie sie kopieren.

Bearbeiten 2: Wie von @David vorgeschlagen, bedeutet kopieren oben das Kopieren des Inhalts, nicht den Zeiger selbst. Dafür gibt es mehrere Möglichkeiten. Sie können es entweder manuell tun (Alt-Weg "geerbt" von C) - dies geschieht mit den Funktionen wie std::strcpy . Dieser Weg ist ziemlich kompliziert, da es eine manuelle Ressourcenverwaltung erfordert, die normalerweise nicht empfohlen wird, da dies zu einem komplizierteren und fehleranfälligen Code führt. Oder Sie verwenden die Smart Pointer oder Container: Sie können entweder std::vector<char> oder std::unique_ptr / std::shared_ptr .

Ich persönlich würde für den zweiten Weg gehen. Sehen Sie die Diskussion zu dieser und @ Oli's Antwort, es kann nützlich sein.

    
Vlad 06.01.2012, 22:58
quelle
6

Wenn Sie die Daten in einen char Puffer bringen wollen, warum sollten Sie es dann nicht sofort dort ablegen? Hier ist eine Stream-Klasse, die ein Array nimmt, seine Größe bestimmt, sie mit Nullzeichen füllt (hauptsächlich um sicherzustellen, dass die resultierende Zeichenkette null terminiert) und dann ein std::ostream einrichtet, um direkt in diesen Puffer zu schreiben.

%Vor%

Offensichtlich würden dieser Stream-Puffer und Stream wahrscheinlich in einem geeigneten Namespace leben und in irgendeinem Header implementiert werden (es macht wenig Sinn, etwas davon in eine C ++ - Datei zu schreiben, da alle Funktionen Templates sind, die instanziiert werden müssen). . Sie könnten auch die [deprecated] Klasse std::ostrstream verwenden, um etwas ähnliches zu tun, aber es ist so einfach, einen benutzerdefinierten Stream zu erstellen, der sich nicht lohnen könnte.

    
Dietmar Kühl 06.01.2012 23:13
quelle
1

Sie können dies tun, wenn Sie eine tatsächliche Kopie der Zeichenfolge benötigen (wichtig, wenn das stringstream-Objekt irgendwann nicht mehr im Gültigkeitsbereich ist):

%Vor%

Wie in den Kommentaren unten besprochen, sollten Sie vorsichtig sein, dies so zu tun (manuelle Speicherverwaltung ist fehleranfällig und sehr nicht-idiomatisches C ++). Warum möchten Sie eine RAW-Char-Array?

    
Oliver Charlesworth 06.01.2012 22:57
quelle

Tags und Links