2011-10-26 41 views

Respuesta

75

Puede utilizar un asterisco (*) para pasar el ancho de especificador/precisión para printf(), en lugar de codificar duro en la cadena de formato, es decir

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

Debe tenerse en cuenta que el argumento 'str_len' debe tener el tipo' int' (o tipo integral más estrecho, que se promovería a 'int'). Sería un error pasar 'long',' size_t', etc. –

+2

Vale la pena mencionar que el propósito probable de este código, especialmente cuando se usa con '% s', es imprimir una subcadena de la cadena original. En este caso de uso, 'str' apunta a algún lugar dentro de la cadena original (posiblemente al principio), y' str_len' especificará la longitud de la subcadena que se debe imprimir. –

11

No creo que el código anterior es correcta pero (de acuerdo con esta descripción de printf()) la .* significa

la anchura no se especifica en la cadena de formato, pero como un argumento adicional valor entero que precede al argumento de que tiene que ser formateado '.

Así que es una cadena con un ancho aceptable como argumento.

+2

He agregado la URL de referencia cruzada para que pueda evitar los cargos de plagio. Por supuesto, la cita correcta dice "La _precisión_ no es ..." en lugar de "La _ anchura_ no es ...". –

+0

Como @MattMcNabb señaló, cada referencia a esa página debe resaltar que "* un valor entero *" es exactamente 'int' (o un subconjunto) - no solo cualquier valor integral como' size_t' o sus posibles alias más intuitivos , como 'std :: string :: size_type'. Esto es aún más confuso, teniendo en cuenta que la página referenciada menciona 'size_t' como uno de los especificadores de tipos admitidos. –