sichere Stringfunktion und va_list
-
Hallo Gemeinde,
ich habe hier eine Funktion, die mir je nach Bedarf eine unterschiedliche Anzahl von Parametern in eine MsgBox schreiben soll. Dafür verwende ich va_list.
void MsgBoxParam(TCHAR * szFormat,...) { TCHAR szBuffer[1024]; va_list va; va_start(va,szFormat); StringCchPrintf(szBuffer,1024,szFormat,va); va_end(va); MessageBox(NULL,szBuffer,TEXT("Test"),MB_OK); }
So rufe ich es z.B. auf:
MsgBoxParam(TEXT("Länge= %i, Breite= %i"),1024,768);
Das Ergebnis ist jedoch, dass nicht die Werte 1024 und 768 angezeigt werden, sondern die Speicheradresse, wo sie abgelegt sind.
Was mache ich hier falsch?
Bin dankbar für jede Hilfe.
-
Ich bin mir nicht sicher ob es dass ist, aber es könnte sein das es nicht %i sondern %d für Integer ist, so wie beim normalen printf auch.
-
carry2012 schrieb:
StringCchPrintf(szBuffer,1024,szFormat,va);
Was mache ich hier falsch?
Richtig ist:
StringCchVPrintf(szBuffer,1024,szFormat,va);
viele grüße
ralph
-
Hi
Da du im Titel "sichere Stringfunktion" geschrieben hast, kann ich nur vorschlagen std::stringstring oder std::wstringstream zu verwenden und die Werte einfach hineinzuschieben. Alle C-String Funktionen und speziell die mit variablen Argumenten sind fehleranfällig und es ist nur eine Frage der Zeit bis du mit einem falschen Formatstring deinen Stack böse überschreibst.
Um dem ANSI / UNICODE Problem zu begegnen verwende ich immer:
#ifdef UNICODE typedef std::wstring tstring; typedef std::wstringstream tstringstream; #else typedef std::string tstring; typedef std::stringstream tstringstream; #endif ... tstringstream strm; strm << TEXT("Länge= ") << 1024 << TEXT(", Breite= ") << 768; MessageBox(NULL, strm.str().c_str(), TEXT("Test"), MB_OK);