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?
-
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.
-
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.