Konversionen zwischen string und String

Veröffentlicht: Dezember 2009
Von Richard Kaiser und Alexander Kaiser

Programme in Standard-C++ verwenden meist nullterminierte Strings (Datentyp char*) oder die Klasse string der Standardbibliothek für Strings. Diese Datentypen sind allerdings nicht mit der Klasse String kompatibel, die unter .NET zur Anzeige von Strings in Steuerelementen verwendet wird. Deshalb besteht auf den ersten Blick eine unüberwindbare Schwierigkeit, Strings aus Standard-C++ in einem Windows .NET Programm auszugeben und einzulesen. Dabei ist das aber ganz einfach, wenn man nur weiß, wie es geht.

Dieser Artikel ist ein kurzer Auszug aus dem Buch „C++ mit Microsoft Visual C++ 2008“ (ISBN 978-3540238690), das C++ mitsamt den Visual C++-Erweiterungen (C++/CLI) umfassend darstellt. Der Verfasser dieses Buches ist ein erfahrener C++- und C#-Trainer, der auch für Firmenschulungen zur Verfügung steht.

Im letzten Abschnitt wurde gezeigt, dass man beliebige Anweisungen von Standard-C++ in einer .NET-Anwendung verwenden kann. Das bedeutet allerdings nicht, dass man alle Datentypen von .NET und Standard-C++ direkt miteinander kombinieren kann. So kann man z.B. einen string der C++-Standardbibliothek nicht direkt aus einer TextBox einlesen oder in eine TextBox ausgeben. Die folgenden beiden Anweisungen sind nicht möglich:

string s= textBox1->Text; // error: keine Konvertierung von String^ in string möglich

textBox1->AppendText(s);  // error: keine Konvertierung von string in String^ möglich

Visual C++ verwendet in seinen .NET-Komponenten immer den Datentyp String und nie string. Wenn man einen string mit einem .NET Steuerelement anzeigen oder einlesen will, muss dieser konvertiert werden. Dazu stehen in Visual C++ 2008 (aber noch nicht in Visual C++ 2005) nach

#include <msclr\marshal_cppstd.h>

im Namensbereich msclr::interop die Funktionen

To_Type marshal_as<To_Type>(From_Type input );

zur Verfügung. Bei ihnen kann für To_Type einer der Datentypen string, wstring oder String^ angegeben werden. In diesen Datentyp wird dann das Argument für input konvertiert.

Zulässige Kombinationen der Argumente für marshal_as:

To_Type Datentyp des Arguments für input
std::string String^
std::wstring String^
String^ std::string
String^ std::wstring

Beispiel: Nach

#include <msclr\marshal_cppstd.h>

using msclr::interop::marshal_as;

sind die folgenden Konversionen

std::string s1 = "std::string";

String^ S1 = marshal_as<String^>(s1);

String^ S2 = "System::String";

std::string s = marshal_as<std::string>(S);

möglich. Ein string kann in einem .NET Steuerelement ausgegeben und eingelesen werden:

string s= marshal_as<string>(textBox1->Text)

textBox1->AppendText(marshal_as<string>(s);

Unter Visual C++ 2005 kann man sich mit den folgenden Funktionen behelfen. Sie stehen in StringConv.h im Namensbereich rk1 zur Verfügung.

Da man einen String aus einem Zeiger auf einen nullterminierten String erzeugen kann, kann mit der Funktion c_str() ein string in einen String konvertiert werden.

System::String^ toString(std::string s)

{

return gcnew System::String(s.c_str());

}

Die Konversion in die entgegengesetzte Richtung ist folgendermaßen möglich:

std::string tostring(System::String^ S)

{

std::string s;

for (int i=0;i<S->Length; i++)

  s+=S[i];

return s;

}

Entsprechende Funktionen sind auch für wstring möglich, wenn man in toString und tostring den Datentyp string durch wstring ersetzt. Diese Funktionen sind zusammen mit weiteren Alternativen ebenfalls in StringConv.h enthalten.

Zurück: Typische C- und C++-Anweisungen | Weiter: Einschränkungen bei der Kombination von nativen und verwalteten Klassen