string to char[n] ok, aber wie andersrum?

Thomasio

Erfahrenes Mitglied
Wenn man mal im web sucht, findet man ganz neckische Abkürzungen
Gestern wollte ich einen <string> in ein char[n] umwandeln und fand die Lösung aus meinen Tutorials alle nicht so toll, bis ich im web folgendes gefunden habe:

std::string MyString = "Dies ist ein string";

char MyChar[strlen(MyString.c_str())] = MyString.c_str();

Einfacher gehts nimmer, und wenn man c_str() durch data() ersetzt funktioniert das sogar ohne \0

Heute brauche ich es andersrum, aber da finde ich im ganzen web nichts, bzw nur wahnwitzig umständliche Sachen
Gibt es einen ähnlich einfachen Weg aus einem char[n] einen std::string zu machen?
 
Hallo,

Thomasio hat gesagt.:
Gestern wollte ich einen <string> in ein char[n] umwandeln und fand die Lösung aus meinen Tutorials alle nicht so toll, bis ich im web folgendes gefunden habe:

std::string MyString = "Dies ist ein string";

char MyChar[strlen(MyString.c_str())] = MyString.c_str();
Das ist allerdings so falsch, wie es nur werden kann :)
  1. Um die Länge eines std::string zu ermitteln, gibt es die Methode size().
  2. C-Strings sind nullterminiert, man müsste also – wenn es denn so in der Form korrekt wäre – einen zusätzlichen char für die terminierende Null reservieren.
  3. Spätestens bei der Initialisierung sollte es zu Problemen kommen, da der Datentyp von MyChar und der des Rückgabewertes von c_str() nicht übereinstimmen.
  4. Mit der Arraynotation char MyChar[…] reservierst du zuerst Speicher, auf den MyChar dann verweist. Mit der Zuweisung = MyString.c_str() würde die Information, wo dieser reservierte Speicherbereich liegt, verworfen werden. Das würde im Endeffekt bestenfalls zu einem Speicherleck führen.
Wenn du einen Zeiger auf einen C-String brauchst, der den selben Inhalt wie ein std::string hat, dann geht man in der Regel so vor:
Code:
std::string myString = "foobar";
const char *szMyString = myString.c_str();
Zu erwähnen ist allerdings, dass dieser Zeiger nur solange gültig ist, wie man am ursprünglichen std::string keine Veränderung vornimmt.

Wenn man eine Kopie erhalten will, könnte man so vorgehen:
Code:
std::string myString = "foobar";

char szMyStringCopy[myString.size()+1];
strncpy(szMyStringCopy, myString.c_str(), myString.size()+1);

Heute brauche ich es andersrum, aber da finde ich im ganzen web nichts, bzw nur wahnwitzig umständliche Sachen
Gibt es einen ähnlich einfachen Weg aus einem char[n] einen std::string zu machen?
Ja, es gibt da einen wirklich sehr einfachen Weg:
Code:
char *szMyString = "foobar";
std::string myString(szMyString);
// oder: std::string myString = szMyString;

Wozu brauchst du eigentlich unbedingt einen C-String?

Grüße,
Matthias
 
erstmal danke für die Antwort,

im Prinzip brauche ich das gar nicht, ich bastel nur ziemlich herum,
um aus meinen Tutorials nicht nur den code zu kopieren, sondern auch zu verstehen was da abläuft, denke ich mir kleine Anwendungen aus, die immer ein klein wenig abseits vom Tutorial sind, so dass ich gezwungen bin selber zu denken

Ganz absichtlich gerate ich dabei immer wieder in so kleine Stolperfallen von Fällen, die im Tutorial nicht beschrieben sind, und dann wird Google mein bester Freund

... und wenn ich da auch nichts finde, dann frag ich halt hier ;)

Wie man sieht bin ich gerade beim Kapitel <string>
 
Zurück