strlen eines format strings
-
Guten Morgen,
char * string = "%4x_foo"; size_t n = strlen(string)+1;
liefert mir (in diesem Fall: leider) n==8 zurück.
Da ich n als Größe für ein calloc verwenden möchte, klappt das so natürlich nicht:
if (! (pDest = calloc(n, sizeof *pDest))) return NULL; va_start(args, string); if ((vsprintf(pDest, string, args)) < 0) pDest = NULL;
Gibt es einen Bruder von strlen, der den format string "ausklappen"/evaluieren kann und mir folglich 9 zurückgibt?
Schock
-
Nein.
4 gibt aber auch nur die Mindesbreite an.
Da können auch mehr Zeichen ausgegeben werden.Du erzeugst mit dem
pDest = NULL;
ein Speicherleck.Du kannst auch erst mehr Speicher hollen und dann
realloc
nehemen.
Oder erst in einen Buffer schreiben und dann den Speicher besorgen und kopieren.
-
"Nein" ist schade, aber realloc hört sich gut an.
pDest = NULL sollte vll. eher durch ein free erledigt werden...
Danke
-
Schock schrieb:
Gibt es einen Bruder von strlen, der den format string "ausklappen"/evaluieren kann und mir folglich 9 zurückgibt?
(v)snprintf
?
-
snprintf liefert die Anzahl Zeichen zurueck, die geschrieben worden waeren, selbst wenn das uebergebene Array zu klein ist. Du kannst also bei Bedarf vergroessern.
edit: Zu langsam.
-
Du kannst den Rückgabewert von sprintf auswerten:
int main(void) { char * string = "%4x_foo", tmpstr[100]; int n = sprintf(tmpstr,string,1); printf("%d",n+1); return 0; }
-
So läfut's...
char stringT[40]; va_start(args, string); if ((vsprintf(stringT, string, args)) < 0) { return 0; } va_end(args); n = strlen(stringT) + 1; /* erzeugter string soll !%4 groß sein */ while (n & 3) n++; if (! (pDest = calloc(n, sizeof *pDest))) { return NULL; } memcpy(pDest, stringT, n);
Es kann so einfach sein...
PS: Ich sehe grade, dass ich die Rückgabe des vsprintfs ja eh schon auswerte, nur nicht, wie Ihr vorschlagt... Eiei, soviele Bäume, so wenig Wald...