CString::Format(...) Problem



  • Hallo,

    ich habe es jetzt in dieses Forum gepostet, da es sich um ein Problem mit der Funktion Format von der MFC-Stringklasse CString handelt.

    CString constr = connectDialog.m_Username;
    	constr+= " versucht eine Verbindung zu ";
    	constr.Format("%s%s", constr, connectDialog.m_IP);
    	constr+= " über den Port ";
    	constr.Format("%s%d", constr, connectDialog.m_Port);
    	constr+= " herzustellen.\r\n";
    

    Dieses Programm bringt eine Assertion Failed und wenn ich das 2-3 mal ignoriere konmmt folgendes Ergebnis heraus:

    ЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭ6667 herzustellen.
    

    connectDialog.m_IP ist vom Typ CString und connectDialog.m_Port vom Typ int.
    Im Debugger konnte ich sehen das beide korrekt gefüllt sind.

    Das gültige resultat sollte etwa so aussehen:

    <benutzername> versucht eine Verbindung zu <ip> über den ort <port> herzustellen.
    

    Wue nutze ich CString jetzt richtig um mein Vorhaben in die Tat umzusetzen?

    MfG MAV



  • Vermutung:
    Das Formatfeld %s erwartet einen LPCTSTR. Du übergibst einen CString. Es gibt zwar eine Konvertierung dafür, aber die wird bei einer variablen Parameterliste nicht verwendet, außer du rufst sie explizit (mit einem Cast) auf. Aber warum überhaupt dieses Stückwerk, und nicht gleich so?

    CString constr;
    constr.Format( "%s versucht eine Verbindung zu %s über den Port %d herzustellen.\r\n",
        connectDialog.m_Username, 
        connectDialog.m_IP,
        connectDialog.m_Port);
    


  • Sehr gute Idee, ich versuch mal das ganze Ding.

    In der MSDN war in einem Beispiel %s aber auch für CString reserviert, deswegen müsste es eigentlich gehen.

    EDT:
    Seltsam, die gepackte Version funktioniert wunderbar. 🙂

    Danke!

    MfG MAV



  • Einfach mal die Beschreibung zu CString::Format in der MSDN durchlesen. 🙄

    The call will fail if the string object itself is offered as a parameter to Format. For example, the following code:

    CString str = "Some Data";
    str.Format("%s%d", str, 123);   // Attention: str is also used in the parameter list.
    

    will cause unpredictable results.

    btw: Wie schon gesagt, wenn man mit Format arbeitet dann kann man da gleich alles reinpacken.



  • 😑

    Ich hab mir das Beispiel da angeschaut und dachte, das man das so machen könnte, aber es war ein Beispiel dafür, wie man es nicht machen sollte. 🙄

    OK; es klappt ja mit dem vollen Ding eh besser, also nochmals danke. 👍

    MfG MAV 🙂


Anmelden zum Antworten