String variable in char array umwandeln
-
Hi,
ich habe einen an eine Funktion übergebenen String.
Diese will ich nun in einen char array umwandeln.
Ich bin am rumprobieren aber es geht nicht.
Auch nichtchar array[] = var
oder
char array[var.length]; strcpy(array, var);
lG Maltasar
-
Willst du Schreibend zugreifen oder nur lesen?
Strings haben die c_str() Methode welche einen Zeiger auf einen Char Array zurückgeben. Ggf hilft das schon. Ansonsten musste du ggf den inhalt aus diesen Chararray in einen lokalen kopieren.
-
Hi,
hinter dem Begriff "umwandeln" steckt die falsche Vorstellung.
Du möchtest
- ein char-Array anlegen,
- ... dessen einzelne chars mit den Werten der entsprechenden String-Chars befüllt sind.und genau so sollte es auch laufen:
#include <string> #include <vector> #include <algorithm> using namespace std; int main() { string const var = "Mein String"; char * array = new char[var.size()]; copy(var.begin(), var.end() , array); // .... array verwenden delete[] array; // aufräumen!!
es gibt noch 2 bessere Varianten für bestimmte Fälle:
a) Selbst aufräumen wird unnötig mit vector#include <string> #include <vector> #include <algorithm> using namespace std; int main() { string const var = "Mein String"; vector<char> array(var.size()); copy(var.begin(), var.end() , array.begin() ); // .... array verwenden; &array[0] gibt den char-Pointer // aufräumen macht vector selbst return 0; }
vector hat auch noch den Vorteil, dass man ihn noch nach der Erstellung vergrößern kann (macht Neuanlage, Kopieren und Aufräumen selbst).
b) wenn ein const char schon reicht (sprich: Nur gelesen wird), kann man direkt
var.c_str()
übergeben...Gruß,
Simon2.
-
Bei Variante 1 fehlt beim Array die 0 am Ende.
-
Und wenn der String nicht nullterminiert sein muss:
std::string foo("bar"); char* foobar = &foo[0];
Deutlich performanter als die Rumkopiererei.
-
Simon2 schrieb:
a) Selbst aufräumen wird unnötig mit vector
string const var = "Mein String"; vector<char> array(var.size()); copy(var.begin(), var.end() , array.begin() );
Das geht auch ohne std::copy:
string const var = "Mein String"; vector<char> array ( var.begin(), var.end() );
Man beachte aber, dass es hier keine Nullterminierung gibt.
Icematix schrieb:
Und wenn der String nicht nullterminiert sein muss:
std::string foo("bar"); char* foobar = &foo[0];
Deutlich performanter als die Rumkopiererei.
Da sollte man die Finger von lassen. Soweit ich weiß, macht std::string keine Garantie über das Speicherlayout der einzelnen Zeichen. Du nimmst hier an, dass sie hintereinander im Speicher stehen. Bei std::vector ist das auch so. Aber bei std::string meines Wissens nicht -- also nicht garantiert, meine ich. Ich lasse mich aber gerne belehren: Zitiere bitte den C++ Standard.
kk
-
krümelkacker schrieb:
Simon2 schrieb:
a) Selbst aufräumen wird unnötig mit vector
string const var = "Mein String"; vector<char> array(var.size()); copy(var.begin(), var.end() , array.begin() );
Das geht auch ohne std::copy:
string const var = "Mein String"; vector<char> array ( var.begin(), var.end() );
Man beachte aber, dass es hier keine Nullterminierung gibt.
Icematix schrieb:
Und wenn der String nicht nullterminiert sein muss:
std::string foo("bar"); char* foobar = &foo[0];
Deutlich performanter als die Rumkopiererei.
Da sollte man die Finger von lassen. Soweit ich weiß, macht std::string keine Garantie über das Speicherlayout der einzelnen Zeichen. Du nimmst hier an, dass sie hintereinander im Speicher stehen. Bei std::vector ist das auch so. Aber bei std::string meines Wissens nicht -- also nicht garantiert, meine ich. Ich lasse mich aber gerne belehren: Zitiere bitte den C++ Standard.
kk
Soweit ich informiert bin, ist es exakt so, wie du beschrieben hast: Es gibt keine Garantie, dass die Zeichen nacheinander abgelegt werden (obwohl das sinnvollerweise oft so realisiert wird).
-
Icematix schrieb:
std::string foo("bar"); char* foobar = &foo[0];
Deutlich performanter als die Rumkopiererei.
Jetzt geht das wieder los
Alles zum Thema:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-266965.html
-
Braunstein schrieb:
Bei Variante 1 fehlt beim Array die 0 am Ende.
Stimmt - hatte ich kurzzeitig bedacht ... und dann doch vergessen.
Gut, dass Du nochmal darauf hingewiesen hast
Bei Variante 2 aber auch nicht, oder?krümelkacker schrieb:
...
Das geht auch ohne std::copy:string const var = "Mein String"; vector<char> array ( var.begin(), var.end() );
...
Die hatte ich mal weggelassen, um Verwirrungen vorzubeugen...
Gruß,
Simon2.
-
brotbernd schrieb:
Alles zum Thema:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-266965.htmlDanke für den Link. Bitte dort weiterdiskutieren, ich mach hier dann mal dich dass es nicht 20 Threads zum selben Thema gibt