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


Anmelden zum Antworten