char to string & string to char



  • wie konvertiere ich char in string und wie andersrum?

    und wie setze ich 2 chars zusammen?

    das hier stürzt immer ab

    char test[] = "c:/";
        strcat( test, "arial.ttf" );
    


  • oh man

    warum muss man in char anzahl der arrays angeben?
    es ist immer ungewiss wie lang char sein wird

    bei string to char hab ich c_str(); rausgefunden

    aber wie andersrum?

    wie setzte ich 2 chars ungewiss zusammen



  • Die Funktion "char *strcat(char* a, const char * b)" nimmt den Text aus b und hängt in an a an. Soweit bist du richtig.

    Allerdings erwartet strcat das du in a genügen Speicher bereitstellst, was du nicht tust.

    Bei dir ist a ein char[4] mit folgen Werten :

    Offset 0 1 2 3
    Wert c : / \0

    du brauchst weitere 9 Byte Speicher für die Unterbringung von "arial.ttf".

    probier mal folgenden Code und seh dier die unterschiede zwischen der ersten und zweiten Variante an. Dann sollte es klar werden.

    //Variante 1
    char test[] = "c:/";
    strcat( test, "arial.ttf" );
    
    //Variante 2
    char test[14] = "c:/";
    strcat( test, "arial.ttf" );
    


  • Oder so:

    char n1[] = "test";
    char n2[] = "test2";
    
    char *n3 = new char[strlen(n1) + strlen(n2) + 1];
    sprintf(n3, "%s%s", n1, n2);
    

    Aber das ist C. Nicht C++.



  • Warum überhaupt char* und nicht immer string?

    char test[] = "c:/";
    std::string tstr = test; //Konvertierung char in string
    tstr += "arial.ttf"; //String anhängen
    


  • Braunstein schrieb:

    Warum überhaupt char* und nicht immer string?

    char test[] = "c:/";
    std::string tstr = test; //Konvertierung char in string
    tstr += "arial.ttf"; //String anhängen
    

    Vielleicht, weil es Funktionen gibt, die einfach ein char* benötigen (z.B. PathRemoveFileSpec).



  • Dann kannst du trotzdem std::string benutzen, denn ein String hat die Medthode c_str() die einen C-Style String zurück liefert. :p



  • ... die einen konstanten C-Style String zurückliefert wäre richtig. 😉 :p



  • Naja mitm String auf bsw. ein Zeichen => Zeichenkette umwandeln find ich nen bissel übertrieben 😉

    const char my_char('a');
    char my_string[2] = { my_char, 0 };
    

    wäre da einfacher 😉



  • Ich bin zwar noch C++-Anfänger, kann mir aber kaum vorstellen, dass Folgendes funktioniert:

    std::string sTmp="C:\temp\test.txt";
    PathRemoveFileSpec(sTmp.c_str());
    //sTmp=="C:\temp\"
    

    Ich lasse mich aber gerne eines Besseren belehren. Ich bin zuhause und habe hier momentan keine Entwicklungsumgebung (neuer Rechner), sonst hätte ich es direkt ausprobiert.

    Gruß Matze



  • Hmm nein geht auch nicht. Aber das hat nix mit std::string zu tun 😉

    const std::string temp("C:\\Temp\\Test.txt");
    

    du hast Escaped-Zeichen vergessen 😉

    const std::string temp("C:\\Temp\\Test.txt");
    RemovePathSpecification(temp.c_str());
    

    .



  • Stimmt, es wird nicht funktionieren, weil die Funktion PathRemoveFileSpec einen in-out-Parameter (non-const) hat. Das wurde in diesem speziellen Fall nicht beachtet. Naja, ein Grund mehr von diesen C-APIs weg zu kommen. 😉



  • Man muß natürlich sagen, das man so eine Funktion als C++ler eigentlich nicht bräuchte. Diese API-Funktion von Windows ist sicherlich eine große Hilfe für C-Programmierer. Aber für C++?

    std::string str("C:\\temp\\test.txt");
    str.resize( str.find_last_of('\\') ); // kein PathRemoveFileSpec nötig!
    


  • Artchi schrieb:

    Man muß natürlich sagen, das man so eine Funktion als C++ler eigentlich nicht bräuchte. Diese API-Funktion von Windows ist sicherlich eine große Hilfe für C-Programmierer. Aber für C++?

    std::string str("C:\\temp\\test.txt");
    str.resize( str.find_last_of('\\') ); // kein PathRemoveFileSpec nötig!
    

    Gut zu wissen!

    Zum Thema char*: Auch wenn es nicht mehr nötig sein mag. Ich denke, es kann nicht schaden, auch mal char-Arrays kennenzulernen. Vor allem, wenn man auch mal andere Sachen als Windows-Programme machen will/muss. Das habe ich gemerkt, als ich durch meine neue Arbeit gezwungen war, Microcontroller zu programmieren. Auf 2 KB Flash die std::string-Klasse unterzubringen wäre wohl sehr dreist... 😃

    Gruß Matze


Anmelden zum Antworten