Zeichenarray in vector speichern
-
Hallo,
ich habe eine Schleife die mehrmals durchlaufen wird, in jedem Schleifendurchlauf werden Zeichen erzeugt jetzt möchte ich die Zeichen in einem vector speichern aber es klappt irgednwie nicht (ich will keinen std::string benutzen):
vector<char *>vec; for(int i=0;i<10;i++) { char *p = new char[4]; p[0] = a.getChar(i); p[0] = a.getChar(i+1); p[0] = a.getChar(i+2); p[0] = a.getChar(i+3); vec.push_back(p); }mfg
-
Hallo
Sollen wirklich alle 4 erstellten Chars in das erste Feld des C-Strings? Ich bezweifle das.
Außerdem ist für ein vollständigen C-Array immer noch ein abschließendes 0-Char notwendig, für den aber bei dir noch nichts reserviert und zugewiesen wird.bis bald
akari
-
Ja das stimmt das ist so natuerlich falsch, so sollte es heißen:
[cpp]
vector<char *>vec;
for(int i=0;i<10;i++)
{
char *p = new char[4];
p[0] = a.getChar(i);
p[1] = a.getChar(i+1);
p[2] = a.getChar(i+2);
p[3] = a.getChar(i+3);
p[4] = '\0';vec.push_back(p);
}
-
Hallo
in C/C++ hat ein Array der Größe x immer die Elemente von 0 bis x-1. Du must also deine Grenze erhöhen
char *p = new char[5];bis bald
akari
-
Jetzt klappt es ich erzeuge in jedem Schleifendurchlauf einen Zeichenfolge und speicher sie dann im Vector. Muss man den Speicherbereich wieder freigeben ?
-
Hallo
ja, der vector speichert nur die Pointer, den Speicherbereich der Pointer must du iterativ selber wieder freigeben.
/Edit : warum benutzt du nicht eigentlich so einen vector?
std::vector<char[5]>dann must du keinerlei eigene Speicheroperationen durchführen.
bis bald
akari
-
Wenn ich das so machen spuckt mir der Compiler Fehler aus:
vector<char[5]>vecx; char p[5]; p[0] = '1'; p[1] = '2'; p[2] = 's'; p[3] = 'k'; p[4] = '\0'; vecx.push_back(p);'Initialisierung': 'const char [5]' kann nicht in 'char [5]' konvertiert werden
-
Hallo
sorry stimmt, das geht nicht. Weil char[5] nicht kopierbar ist.
Also bleibts bei dem selber verwalten, und selber wieder aufräumen.bis bald
akari
-
akari schrieb:
sorry stimmt, das geht nicht. Weil char[5] nicht kopierbar ist.
Also bleibts bei dem selber verwalten, und selber wieder aufräumen.Es gibt noch eine Möglichkeit. Man packe das Array in eine Struct - etwa so:
struct char_array { char& operator[]( unsigned i ) { return m_data[i]; } char m_data[5]; }; // -- Anwendung vector< char_array > vecx; char_array p; p[0] = '1'; p[1] = '2'; p[2] = 's'; p[3] = 'k'; p[4] = '\0'; vecx.push_back(p);Wenn man char_array noch mit einem Assignment-Operator für C-Strings ausstattet, wird's übersichtlicher
#include <algorithm> // copy #include <cassert> #include <cstring> // strlen struct char_array { enum { MY_SIZE = 5 }; char& operator[]( unsigned i ) { assert( i < MY_SIZE ); return m_data[i]; } char_array& operator=( const char* txt ) { using namespace std; assert( strlen( txt ) < MY_SIZE ); copy( txt, txt + strlen( txt ), m_data ); return *this; } char m_data[5]; }; // -- Anwendung vector< char_array > vecx; char_array p; p = "12sk"; vecx.push_back(p);.. bei weiteren Ausbau von char_array ist man schnell bei boost::array.
Kazuo schrieb:
... (ich will keinen std::string benutzen)
Warum nicht?
Gruß
Werner