Konvertierung char in CString und umgekehrt



  • In einer Memberfunktion einer Klasse wird eine Variable

    char	Dateipfad[]="";
    

    erwartet. Die Vorgaben für diese Variable sind allerdings vom Typ CString

    CString  Pfad_LogDatei;
    

    dafür kommen aus einer anderen Klasse und werden im Doc des Applikationsobjektes ebenfalls als CString gespeichert. Das Problem ist jetzt die Konvertierung vom char in CString und umgekehrt. Wie bewerkstellingt man das? Einfach castern geht zumindest schon mal nicht... 😕



  • Hi,

    nichts einfaches :

    char	text1[10] = "Hallo";
    	char	text2[10] = {0};
    
    	CString cstr = text1;
    	strcpy (text2, (LPCTSTR)cstr);
    

    Schoenen Montag.

    Fredy Kruger



  • Fredy Kruger schrieb:

    Hi,

    nichts einfaches :

    char	text1[10] = "Hallo";
    	char	text2[10] = {0};
    
    	CString cstr = text1;
    	strcpy (text2, (LPCTSTR)cstr);
    

    Schoenen Montag.

    Fredy Kruger

    Zunächst mal vielen Dank. Es funktioniert auch wenn man

    strcpy (text2, cstr);
    

    verwendet. Ich hab allerdings nicht text2[10] sondern text2[]. Was mach ich damit?



  • AndyDD schrieb:

    verwendet. Ich hab allerdings nicht text2[10] sondern text2[]. Was mach ich damit?

    Gut aufpassen, daß der Platz ausreicht - der wird ohne explizite Angabe durch den Initialisierungsstring festgelegt. Und dein "char Dateipfad[]="";" hat die Größe von 1 Byte (Null als Stringende-Zeichen), könnte also etwas zu klein werden.

    btw, char (Zeichen) ist etwas anderes als char[] (Zeichen-Array) oder char* (Pointer auf Zeichen(array)).



  • Genau das ist mein Problem. Ich hab das schon auch so verstanden wie Du das da beschreibst. Abhilfe würde ein genügend großes Array (z.B. char text[255]) schaffen. Es soll ja nur einen Dateipfad aufnehmen. Nur was mach ich dann mit den überschüssigen "leeren" Zeichen wenn die Zeichenkette, die ich reinschreibe, kleiner ist wie 255? Gibts da keine Probleme? Wo sitzt dann eingentlich das Zeichen "\0"? Doch sicher ganz am Ende.... 😕
    Zum Hintergrund: ich brauch das char-Array um Werte in die Registry zu schreiben und zu lesen. Das Modul was ich dafür verwende ist fertiger Code der das eben in der Art und Weise fordert. Im Doc selbst muss ich aber mit CStrings arbeiten, was ich allgemein komfortabler finde.



  • Ich hab da noch nen hilfreichen Schnipsel:

    CString strCmd("Irgend ein Text");
    char* pExe = new char[strCmd.GetLength()+1];
    sprintf(pExe, _T("%s\0"), strCmd);
    


  • Was spricht gegen GetBuffer?



  • @:-)):
    Eine Variante wäre:

    LPTSTR	lpPathString=m_csFolder.GetBuffer(m_csFolder.GetLength());
    

    Muss man da noch m_csFolder.ReleasBuffer() aufrufen?

    @estartu_de:
    Funktioniert im Prinzip auch. Allerdings darf man da das delete nicht vergessen.

    Danke nochmal.



  • AndyDD schrieb:

    Nur was mach ich dann mit den überschüssigen "leeren" Zeichen wenn die Zeichenkette, die ich reinschreibe, kleiner ist wie 255? Gibts da keine Probleme?

    Nö, jede (vernünftige) Bibliotheksfunktion hört am \0 auf, den String zu verarbeiten.

    Wo sitzt dann eingentlich das Zeichen "\0"? Doch sicher ganz am Ende.... 😕

    Genau, das sitzt am Ende und sagt dem User in etwa "hier ist dein String zu Ende. Wenn du jetzt weiterliest, dann auf eigene Gefahr.".
    *grübelt* und afaik sollte strcpy das Stringende-Zeichen mitkopieren, also hast du mit dem übertragenen String keine Längenprobleme.

    @estartu_de: Aber immer dran denken - was du mit new[] angelegt hast, mußt du mit delete[] wieder aufräumen 😉



  • AndyDD schrieb:

    @estartu_de:
    Funktioniert im Prinzip auch. Allerdings darf man da das delete nicht vergessen.

    Ups, danke ich HATTE es vergessen. 😃
    Dann aber:

    delete[] pExe;
    

    🙂



  • Ist doch kein Problem, das sonst entstehende Speicherleck wird zumindest angezeigt... 😃

    Mich interessiert aber trotzdem noch, ob man bei der Variante mit CString::GetBuffer() ein CString::Release() braucht.... 😕



  • so gehts auch:

    char buffer[]="Text";
    CString str=buffer;
    

    oder:

    str.Insert(0,buffer);
    


  • qasdfgh schrieb:

    so gehts auch:

    char buffer[]="Text";
    CString str=buffer;
    

    oder:

    str.Insert(0,buffer);
    

    Naja nicht ganz. Bei Deiner Version ist ein für alle Mal die Variable Buffer auf 5 Zeichen festgelegt (Text hat 4 Buchstaben + \0). Ein Dateipfad kann allerdings beliebig lang oder kurz sein.

    @cs:
    Mit der Frage nach der Stelle des "\0" meinte ich mit Ende des Strings das physische Ende.
    Also entweder:
    "Das ist ein Text!.......\0" <-Ende der Zeichenkette mit 25 Zeichen
    oder
    "Das ist ein Text!\0......." <-Ende der Zeichenkette mit 25 Zeichen
    Mir ist schon klar das alle Stringmanipulatoren nur bis zum "\0"-Zeichen arbeiten. Meine Frage zielte darauf ab, dass ich einfach an den Pfadstring einen variablen Dateinamen anhängen will. Blöd wäre dann wenn irgendwo Leerzeichen dazwischen auftauchen würden. Allerdings hab ich durch probieren festgestellt, dass Variante 2 der Realität entspricht.


Anmelden zum Antworten