LoadString und %s



  • Hallo,

    Ich möchte aus meinem Stringtable einen Satz holen, wo ein %s als Platzhalter für Formatierung drin ist. Nun schlägt der nachfolgende Code fehl (z.T. Pufferüberlauf oder falsche Werte).

    CString text;
    text.Loadstring(IDS_MYTEXT); //"Name: ""%s"""
    CString name(_T("Micha"));
    text.Format(text, name);     //Pufferüberlauf
    
    text.Format(_T("Name: %s"), name); //funktioniert
    

    Kann mir jemand sagen, wie ich die Zeichen aus der Stringtable hole, damit ich sie formatieren kann?

    Grüße
    Micha



  • CString text,text1;
    	text.LoadStringA(IDS_STRING130);
    	CString name(_T("Micha"));
    	text1.Format(text, name);     //Pufferüberlauf
    

    in deiner Version Wird Text während es gelesen wird schon wieder überschrieben, das geht nach hinten los

    "Name: ""%s"""

    hast du hoffendlich nicht so in deiner Resource stehen oder is das gewollt?


  • Mod

    100% ACK zu CTecS

    Es geht aber noch einfacher: 🕶

    CString text; 
    CString name(_T("Micha")); 
    text.Format(IDS_MYTEXT, name.GetString());
    

    BTW: Es ist nicht korrekt ein CString Objekt in einer Liste von Arguemnten mit ... zu verwenden.
    http://blog.m-ri.de/index.php/2008/01/08/die-unsitte-objekte-direkt-in-printf-und-funktionen-mit-variabler-anzahl-von-argumenten-zu-nutzen/



  • in deiner Version Wird Text während es gelesen wird schon wieder überschrieben, das geht nach hinten los

    Habe mir den Beitrag auch gerade angesehen. Doch das verstehe ich nicht, wo wird er denn überschrieben?



  • text.Format(text, name);
    

    da wird aus der Variablen text welche in klammern steht der Formatstring gelesen und auf die gleiche Variable text als Ziel geschrieben. Da Format das Ergebnis dirkt schreibt, überschreibt er die Quelle, was dann zu deinem Problem führt das der wegfliegt. Ich hoffe das genügt dir als Erklärung.

    Mach es einfach wie Martin das geschrieben hat und alles ist gut.


  • Mod

    Das Problem ist, dass der String, der als Format übergeben wird als PCTSTR ermittlet wird für das CString Objekt text. Gleichzeitig führt aber CString::Format ein löschen des Speichers durch.

    Der Inhalt auf den der PCTSTR String zeigt ist nun Müll...



  • text.Format(text, name);
    

    Ups. Klar das geht nicht. Irgenwie habe ich übersehen, dass vor dem Format und in der Klammer die gleiche Vraiable steht.


Anmelden zum Antworten