2011-10-26 13 views

risposta

75

È possibile utilizzare un asterisco (*) per passare alla larghezza specificatore/precisione per printf(), invece di difficile codificazione nella stringa di formato, vale a dire

void f(const char *str, int str_len) 
{ 
    printf("%.*s\n", str_len, str); 
} 
+1

Si noti che l'argomento 'str_len' deve avere il tipo' int' (o il tipo integrale più stretto, che sarà promosso a 'int'). Sarebbe un bug passare 'long',' size_t', ecc. –

+2

Vale la pena ricordare che il probabile scopo di questo codice, specialmente se usato con '% s', è di stampare una sottostringa della stringa originale. In questo caso d'uso, 'str' punterebbe a qualche parte all'interno della stringa originale (possibilmente all'inizio), e' str_len' specificherà la lunghezza della sottostringa che dovrebbe essere stampata. –

11

Non credo che il codice di cui sopra è corretto ma (secondo questa descrizione printf()) del .* mezzi

la larghezza non è specificato nella stringa di formato, ma come parametro aggiuntivo valore intero che precede l'argomento che deve essere formattato '.

Quindi è una stringa con una larghezza passabile come argomento.

+2

Ho aggiunto il riferimento incrociato all'URL in modo da poter evitare accuse di plagio. Certamente, la citazione corretta dice "La decisione non è ..." piuttosto che "La larghezza non è ...". –

+0

Come sottolineato da @MattMcNabb, ogni riferimento a quella pagina deve evidenziare che "* un valore intero *" è esattamente "int' (o un suo sottoinsieme) - non solo qualsiasi valore integrale come" size_t "più intuitivo oi suoi possibili alias , come 'std :: string :: size_type'. Ciò è ancora più confuso, tenendo conto che la pagina di riferimento menziona 'size_t' come uno degli specificatori di tipi supportati. –