sprintf kapselung
-
da gabs irgendwo mal ne nette kleine funktion wie man sprintf kapselt und das ergebnis als string zurückgibt
aber ich find sie grad nich
-
std::stringstream
-
oder boost::format
-
ne ich brauchs ohne stl für meine eigene string klasse
-
Sovok schrieb:
ne ich brauchs ohne stl für meine eigene string klasse
Wie stellst du dir eine Kapselung von printf vor?
Du weisst schon, dass das total unsicher ist. boost::format ist dagegen schön sicher und bietet sogar eine größere Flexibilität als printf.
-
Boost libraries rely on modern C++ features such as templates and the C++ Standard Library
ich kannst mir ned aussuchen... hab auf der plattform kein stl... nur c++ und ansi c funktionen
ich möchte nur die parameter an sprintf weiterleiten
wenn möglich mit vorheriger größenüberprüfung
-
suchst du vielleicht vsprintf?
btw: welche Plattform ist das denn, dass sie keine STL hat? Ist es vielleicht möglich dort STLPort zu installieren?
-
ne stlport geht au ned (hab keine exceptions)
ich will nur mit ner eigenen funktion sprintf parameter annehmen und an sprintf weitergebensind 5 zeilen code... aber ich find sie nich mehr... vielleicht sollt ich nochmal suchen... geht wohl schneller
-
Braucht STLPort denn Exceptions? Ich bilde mir ein, dass dies nicht nötig ist...
Naja, du kannst sowieso keine Parameter an sprintf weitergeben. Du kannst dur vsprintf aufrufen...
-
Ich kenn mich da nicht so aus und bin mir nicht so sicher, ob das jetzt zum Thema ist, aber meinst du vielleicht:
void dumdidum(char* msg, ...) { va_list args; va_start(args,msg); char szBuf[1024]; vsprintf(szBuf,msg,args); }
szBuf enthält dann den formatierten String.
-
vsprint und printf sind unsicher!
es ist immer besser snprintf und vsnprint zu benutzen!
-
@itman is kein ansi
-
*****
-
itman schrieb:
vsprint und printf sind unsicher!
es ist immer besser snprintf und vsnprint zu benutzen!Blödsinn:
void something(char const* str) { size_t len=strlen(str); char* buffer=new char[4+len+1]; for(int i=0; i<10; ++i) { sprintf(buffer, "%d. %s", i+1, str); someotherthing(str); } }
Wo brauche ich da bitte snprintf? sprintf tut es genauso, nur besser.
-
@itman is kein ansi
aber Posix oder Unix98 compatible. Und WinXXX compatibel dabei.
-
[quote]
Wo brauche ich da bitte snprintf? sprintf tut es genauso, nur besser.
[quote]
"buffer overflow" zu vermeiden.
-
itman schrieb:
und hier ist ein arbeitender Beispiel:
#include <iostream> #include <string> #include <stdio.h> #include <stdarg.h> using namespace std; string Format (const char * fmtspec, ...) { va_list ap; va_start (ap, fmtspec); va_end (ap); char * buf = NULL; for (unsigned int initLen = strlen (fmtspec) + 1;;initLen = initLen * 2 + 1) { delete [] buf; buf = new char [initLen + 1]; buf [initLen] = 0; unsigned int res = vsnprintf (buf, initLen, fmtspec, ap); if (res < initLen) { return string (buf); } } } int main (void) { string s = Format ("Big test %d %4.2f", 23, 44.533); cout << s<<endl; }
-
-
itman schrieb:
Wo brauche ich da bitte snprintf? sprintf tut es genauso, nur besser.
"buffer overflow" zu vermeiden.
wo ist da ein potentieller Bufferoverflow?
Ich muss nur auf Usereingaben acht geben - beim rest kenne ich die größen meiner Strings...
-
kein Standard ist
kein ANSI 89 Standard aber ist C99 standard.