C++ char* und string Problem

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von martinustreveri.

    C++ char* und string Problem

    Ich weiß das das hier ein VB-Forum ist aber vielleicht kennt sich ja der ein oder andere etwas mit C++ aus...

    Also ich übe mich gerade in der Programmierung mit der WinAPI zum erstellen von Windows Fenstern (mit Code::Blocks als IDE).
    Zum üben habe ich mir vorgenommen einen Taschenrechner zu programmieren, die Steuerelemente sind schon fertig es geht nurnoch um die funktionen und da hab ich mein Problem:
    Ich will an den Text in der TextBox z.B eine "1" dranhängen. Um einen Text einzufügen benutzen ich die API SetWindowText, diese funktioniert auch super aber ich kann damit nur den Text setzen aber nicht anhängen. Also hab ich mir ein char* Variable angelegt wo der Text gespeichert werden soll, aber wie kann ich an eine char* Variable einen Text anhängen? Methoden wie "strcat" funktionieren nicht(Fehlermeldung von VisualStudio). Klar könnte man es mit strings versuchen aber da gibt mir Code::Blocks immer eine Fehlermeldung aus. Hier mal der Code mit dem ich den string deklariere:

    PHP-Quellcode

    1. #include <windows.h>
    2. #include <string.h>
    3. std::string text;
    4. ... Restlicher Code


    Ich krieg dann von Code::Blocks immer die Fehlermeldung das die Variable "text" nicht deklariert sei :huh: .
    Ich hoffe das sich jemand von euch mit sowas auskennt und mir helfen kann.

    Mfg dave962

    PS: Wenn ihr noch mehr Code braucht oder mehr Informationen, sagt einfach bescheid.

    PHP-Quellcode

    1. // dein String
    2. std::string text;
    3. // Erstellen eines C-Strings auf dem Stack (schneller)
    4. // Setze die 100 auf die maximale Textlänge + 1
    5. // mehr als 100 ist SEHR SEHR unwahrscheinlich bei einem Fenstertitel
    6. char szText[101];
    7. // Kopieren
    8. strcpy(szText, text.c_str());
    9. // Neues Zeichen anhängen (hier als Beispiel ein Punkt)
    10. strcat(szText, ".");
    11. // SetWindowText aufrufen und szText benutzen


    Gruß
    To make foobar2000 a real random music player, I figured out the only way to achieve this is to use Windows Media Player.

    At some point in time, you recognize that knowing more does not necessarily make you more happy.
    Achja... Eine "string.h" gibt es in der STL nicht (genau genommen gehört die std::string Klasse nicht einmal zur STL, aber lassen wir das...)! Es heißt:

    Quellcode

    1. #include <string>

    Dass das ganze so funktioniert ist wohl nur durch die Toleranzgrenze des Compilers ermöglicht worden.

    Gruß
    To make foobar2000 a real random music player, I figured out the only way to achieve this is to use Windows Media Player.

    At some point in time, you recognize that knowing more does not necessarily make you more happy.
    @Chrisber Hmm danke für den Hinweis! Die strings gehen jetzt auch...
    Aber ich verstehe das jetzt nicht so ganz ich habe sowoh #include <string.h> als auch #include <string> probiert...
    Naja egal hauptsache es funktioniert jetzt!

    @martinustreveri
    Ja wäre natürlich sicherer aber ich schätze das ich es im moment erstmal nicht brauche aber trotzdem danke.
    Das einzig vernünftige wäre wohl das hier:

    PHP-Quellcode

    1. std::string text;
    2. std::string copy;
    3. copy << text << ".";
    4. SetWindowText("...", copy.c_str());


    Bei deiner Methode wird der Heap benutzt. Ist für so etwas unnötig wie ich finde, da der Stack um ein vielfaches schneller ist (ok, das ist wirklich völlig egal hier). Du hast übrigens vergessen, den Speicher zu löschen (= Memoryleak) :P
    So wäre es wohl "richtiger":

    PHP-Quellcode

    1. std::string text;
    2. // text eingeben...
    3. // text.length() + 1 = Länge von Text + 1 für die binäre Null (\0 als Escapesequenz)
    4. // _wird auf dem Heap angelegt :)
    5. char *pszText = new char [text.length() + 2]; // Platz für das zu anhängende Zeichen ( + 1, für Zeichen, +1 für bin. Null)
    6. //Inhalt kopieren:
    7. strncpy(pszText, text.c_str(), text.length()); // Platz für binäre Null lassen, wir haben oben eine Stelle freigelassen, also reicht text.length().
    8. //Inhalt einfügen, aus cstring.
    9. strncat(pszText, ".", text.length() + 1); // Hier + 1, um Text anzuhängen und nicht zu überschreiben.
    10. //-> SetWindowTitle
    11. // Heap bereinigen
    12. delete[] pszText;

    Von den Helferfunktionen mit dem "n" halte ich eher nichts. Ich finde, man sollte wissen, mit welchen Größen man arbeitet ;)
    Aber egal, jedem das Seine.

    Edit:
    die Headerdatei heißt cstring

    Nein... Die Headerdatei für std::string heißt <string> - nicht mehr, nicht weniger. "cstring.h" ist für C-Strings und wird in neuen Compilern mit C++ Unterstützung automatisch im <string>-Modul oder <iostream>-Modul (oder irgendeinem Modul der STL) mitgeliefert.

    Gruß
    To make foobar2000 a real random music player, I figured out the only way to achieve this is to use Windows Media Player.

    At some point in time, you recognize that knowing more does not necessarily make you more happy.