string in char array das sich auf dem heap befindet



  • Hier aus einer Klasse folgende Methode:

    void Letters::input()
    {
        string temp;
        cin >> temp;
        buffer=new char[temp.length()]; //buffer --> Elementvariable "char *buffer;"
        *buffer=temp.c_str();
    }
    

    ERROR:
    C:\MinGW\Andi\char.cpp:23: error: invalid conversion from `const char*' to `char'

    Warum gehts das nicht?
    Kann man das auch anderst machen, wenn man eine Eingabe in "char" speichern möchte, aber nicht weiß wieviel der Benutzer eingeben wird?



  • Das könnte daran liegen dass Du einem char (ein einzelnes Zeichen) einen const char* (einen konstanten Zeiger auf den Anfang einer Zeichenkette) zuweisen möchtest. Das passt mal garnicht 😉

    Ich würde direkt mit dem String weiterarbeiten. Warum willst Du hier überhaupt mit nacktem Speicher hantieren? Wenn Du das dennoch machen musst, musst Du den String per strcpy in den Buffer kopieren.



  • Aso, stimmt. Ich war so fixiert auf den Operator "=", das ich das ganz vergessen habe, das des nur bei string geht.
    Ich will den string, bzw. das char array, in einzelne Buchstbane zerlegen, aber wie das bei strings geht weiß ich nicht (glaub irgendwie mir Iterator oder so? Zumindestens kann ich das so noch nicht, und nutze somit <cstring>).

    MfG
    Stromberg



  • Das ist bei std::string genauso einfach wie bei Arrays. str[i] ist das einzelne Zeichen, wobei i natürlich < str.length() sein muss.



  • Ach so läuft der Hase, ja dann is es ja echt einfach.
    Danke.

    MfG
    Stromberg



  • Bis zuwieviel Buchstaben kann man den eigentlich in einen string reinschreiben?

    MfG
    Stromberg



  • So viel du willst (d.h. bis der Hauptspeicher voll ist), da der String intern den Speicher reserviert und nötigenfalls neuen Speicher reserviert.
    Darum verwendet man in C++ keine nackten char-Arrays, weil es so schön einfach ist.

    Bei 'cin >> str' mußt du nur beachten, daß Leerzeichen als Trenner gelten.
    Um eine komplette Zeile zu lesen, kannst du 'getline(cin, str)' benutzen.



  • Th schrieb:

    So viel du willst (d.h. bis der Hauptspeicher voll ist), da der String intern den Speicher reserviert und nötigenfalls neuen Speicher reserviert.

    Genau genommen ein Byte weniger als der Haupspeicher zulässt - schließlich muß der String immer noch in der Lage sein, ein '\0' anzuhängen, wenn das verlangt wird 😃 (*klugsch***-Modus aus*)

    @Stromberg: Dir ist hoffentlich klar, daß das angeforderte Array etwas zu klein ist für deinen String - da fehlt der Platz für den Null-Terminator.



  • CStoll schrieb:

    Th schrieb:

    So viel du willst (d.h. bis der Hauptspeicher voll ist), da der String intern den Speicher reserviert und nötigenfalls neuen Speicher reserviert.

    Genau genommen ein Byte weniger als der Haupspeicher zulässt - schließlich muß der String immer noch in der Lage sein, ein '\0' anzuhängen, wenn das verlangt wird 😃 (*klugsch***-Modus aus*)

    @Stromberg: Dir ist hoffentlich klar, daß das angeforderte Array etwas zu klein ist für deinen String - da fehlt der Platz für den Null-Terminator.

    ?? die länge des strings is doch index(letztes_element) + 1 afaik, des heißt von der größe her sollte des array schon passen, oder hab ich jetz an denkfehler



  • std::string::size() liefert die tatsächliche Größe des Strings (ohne den für C-Strings nötigen Null-Terminator) zurück. (und der Standard legt nicht einmal feswt, daß die internen Daten von std::string jederzeit Null-terminiert sind - er kann seine Länge auch gesondert verwalten und erst beim c_str()-Aufruf das '\0' anhängen)



  • Wenn Du bei 0 anfängst zu zählen ist die Länge == dem Index des letzten Elements. Dennoch ist der String plus einem Nullbyte ein Byte länger als der String ohne ein Nullbyte...



  • void Letters::input()
    {
        std::string tmp;
        std::getline(std::cin, tmp);
        char* buf = new char[tmp.length() + 1];
        std::strcpy(buf, tmp.c_str());
        // use it babe :D 
        delete [] buf;
    }
    

    und gut is 😛


Anmelden zum Antworten