Seite 1 von 1
std::string nach char[255]
Verfasst: Fr Jan 11, 2013 2:49 pm
von Glocke
Hi, ich habe eine Struktur
und will sie via SDL_net und TCP versenden. Das klappt soweit. Nur ist das "Reinbekommen" des Strings umständlich. Einen normalen std::string zuweisen geht logischerweise ja nicht.
Folgende Variante geht:
Code: Alles auswählen
struct Data {
char name[255];
// weitere Daten
void set_name(std::string str) {
size_t i = 0;
while (i < str.length() && i < 255) {
this->name[i] = str[i];
i++;
}
this->name[i] = '\0';
}
};
und dann
Dabei schneidet er ja alle Zeichen, die nicht reinpassen ab. Gibt es eine String-Methode, die das (was mein Setter macht) direkt macht? std::string's Methode c_str() liefert ja einen char* - allerdings weiß ich ehrlich gesagt nicht, wie ich das verwende um mein char-Array zu füllen. Die letzten Erinnerungen an meinen alten Berufsschulunterricht mit C++ war: "Ein Char-Array ist ein Char-Pointer" - nur sind die beiden gar nicht gleich
LG Glocke
Re: std::string nach char[255]
Verfasst: Fr Jan 11, 2013 2:55 pm
von Xin
Glocke hat geschrieben:Gibt es eine String-Methode, die das (was mein Setter macht) direkt macht? std::string's Methode c_str() liefert ja einen char* - allerdings weiß ich ehrlich gesagt nicht, wie ich das verwende um mein char-Array zu füllen. Die letzten Erinnerungen an meinen alten Berufsschulunterricht mit C++ war: "Ein Char-Array ist ein Char-Pointer" - nur sind die beiden gar nicht gleich
Du kannst den String nach seiner Länge fragen.
Wenn die Länge zu groß ist, kürzt Du:
Dann kopierst Du:
und setzt Deinen Entmarker:
Müsste funktionieren.
Re: std::string nach char[255]
Verfasst: Fr Jan 11, 2013 3:08 pm
von Glocke
Danke, das klappt super.
Damit ich die 4 Zeilen nicht immer schreiben muss, hab ich mir ne Funktion geschrieben:
Code: Alles auswählen
void string2array(std::string src, char* dest, size_t maxlen) {
// assert valid length
size_t len = src.length();
if (len > maxlen) {
len = maxlen - 1;
}
// copy characters
memcpy(dest, src.c_str(), len);
// set final char
//dest[len] = '\0';
}
Nur kann ich dann das '\0' nicht mehr anhängen, weil ich kein gültiges Array habe. Komischer weise geht es auch ohne den "Terminator"-Char (heißt der so? das fällt mir zumindest ein wenn ich an den Unterricht zurückdenke).
Was macht der gleich nochmal in dem Kontext?
/EDIT: kann ich den dest-Pointer um len*sizeof(char) hintergehen und dann mein '\0' reinschreiben? Ich meine das geht, aber ist das so richtig & sinnvoll?
/EDIT2: Dankeschön
LG Glocke
Re: std::string nach char[255]
Verfasst: Fr Jan 11, 2013 3:55 pm
von Xin
Glocke hat geschrieben:Nur kann ich dann das '\0' nicht mehr anhängen, weil ich kein gültiges Array habe.
Was heißt, dass Du kein gültiges Array hast!?
Du hast doch gerade mit memcpy reinkopiert!?
Glocke hat geschrieben:Komischer weise geht es auch ohne den "Terminator"-Char (heißt der so? das fällt mir zumindest ein wenn ich an den Unterricht zurückdenke).
Was macht der gleich nochmal in dem Kontext?
Das Nullbyte am Ende gibt an, dass der String zu Ende ist.
Das übermitteln sollte so auch klappen... die Frage ist, woher erkennt der Empfänger, wie lang der String ist, wenn da kein Nullbyte ist!?
Glocke hat geschrieben:/EDIT: kann ich den dest-Pointer um len*sizeof(char) hintergehen und dann mein '\0' reinschreiben? Ich meine das geht, aber ist das so richtig & sinnvoll?
Das geht alles, aber genau das und nichts anderes macht auch dest[len] = '\0';
Glocke hat geschrieben:/EDIT2: Dankeschön

Biddeschön.

Re: std::string nach char[255]
Verfasst: Sa Jan 12, 2013 12:21 pm
von Glocke
Xin hat geschrieben:Glocke hat geschrieben:Nur kann ich dann das '\0' nicht mehr anhängen, weil ich kein gültiges Array habe.
Was heißt, dass Du kein gültiges Array hast!?
Du hast doch gerade mit memcpy reinkopiert!?
Ich hatte erst void* statt char* verwendet, da wollte er den []-Operator nicht verwenden. Mit char* ist der []-Operator aber anwendbar. Damit hat es so geklappt, wie du sagtest
LG Glocke