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 ?


  • Mod

    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;
    }
    

    http://ideone.com/CKWNjF



  • 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... 🤡


Log in to reply