• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

Frage an die C++-Gurus

Mitglied seit
04.08.2002
Beiträge
1.869
Reaktionen
0
Eine knifflige Frage. Habe lange erfolglos nach ner Lösung gesucht, aber vielleicht hat hier ja jemand ne Idee. Geht um folgende Funktion:

void logMessage(const std::string& strFormat, ...)
{
char acBuffer[strFormat.length() + 1024];

va_list argList;

va_start(argList, strFormat);
vsprintf(acBuffer, strFormat.c_str(), argList);
va_end(argList);

//...
}

Wie man sieht, arbeitet die Funktion im Prinzip wie printf - sie erwartet einen Format-String und ne variable Liste von Argumenten und baut daraus dann einen finalen String zusammen, mit dem man dann weiterarbeiten kann.

Das Problem ist nun folgendes: Wie man sieht, setze ich die Buffer-Size oben fest auf (Länge des Format-String + 1024). Das knallt natürlich sofort, sobald die zusätzlichen Argumente mal etwas länger werden.

Hat jemand ne Idee, wie ich vorher rausbekommen kann, wieviel Speicher ich allokieren muss?
 

RRA^StArFiRe

Guest
in der msdn lib gibs dochn beispiel:

Code:
void test( char * format, ... )
{
   va_list args;
   int len;
   char * buffer;

   va_start( args, format );
   len = _vscprintf( format, args ) // _vscprintf doesn't count
                               + 1; // terminating '\0'
   buffer = malloc( len * sizeof(char) );
   vsprintf( buffer, format, args );
   printf( buffer );
   free( buffer );
}

aber ich hätts wahrscheinlich so gemacht, den buffer auf die maximale stringlänge zu setzen.
der wird doch nach der funktion eh wieder freigegeben.


e: achso, _vscprintf() ist wahrscheinlich die funktion, die dir da sehr weiterhilft ;)
 
Mitglied seit
04.08.2002
Beiträge
1.869
Reaktionen
0
Danke erstmal für die schnelle Antwort.

Aber leider kann ich die von Dir vorgeschlagene Funktion nicht verwenden, weil's ne dotNet Funktion ist und das ganze später auch auf anderen Plattformen laufen soll (sorry, hätte ich vielleicht vorher erwähnen sollen).

edit:
OK, hab's hinbekommen. Des Rätsels Lösung war die Funktion vsnprintf. Gott, ich hab gar nicht gewusst, wie viele verschiedene Varianten es von diesem Drecksding gibt ^^

Trotzdem nochmal danke an Starfire, Du hast mich auf die richtige Fährte geführt ;)
 
Oben