std::string nach char[255]

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

std::string nach char[255]

Beitrag von Glocke » Fr Jan 11, 2013 2:49 pm

Hi, ich habe eine Struktur

Code: Alles auswählen

struct Data {
    char name[255];
    // weitere Daten
};
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

Code: Alles auswählen

myData->set_name("Foobar");
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 :P

LG Glocke

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: std::string nach char[255]

Beitrag von Xin » Fr Jan 11, 2013 2:55 pm

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 :P
Du kannst den String nach seiner Länge fragen.

Code: Alles auswählen

unsigned int length = str.size();
Wenn die Länge zu groß ist, kürzt Du:

Code: Alles auswählen

if( length > 254 ) length = 254;
Dann kopierst Du:

Code: Alles auswählen

memcpy( name, str.c_str(), length )
und setzt Deinen Entmarker:

Code: Alles auswählen

name[length] = '\0';
Müsste funktionieren.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: std::string nach char[255]

Beitrag von Glocke » Fr Jan 11, 2013 3:08 pm

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

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: std::string nach char[255]

Beitrag von Xin » Fr Jan 11, 2013 3:55 pm

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. ;-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: std::string nach char[255]

Beitrag von Glocke » Sa Jan 12, 2013 12:21 pm

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

Antworten