Tengo un fragmento de código en el que hay un
printf("%.*s\n")
que %.*s
significa
Tengo un fragmento de código en el que hay un
printf("%.*s\n")
que %.*s
significa
Respuestas:
Puede usar un asterisco ( *
) para pasar el especificador de ancho / precisión printf()
, en lugar de codificarlo en la cadena de formato, es decir
void f(const char *str, int str_len)
{
printf("%.*s\n", str_len, str);
}
str_len
argumento debe tener tipo int
(o tipo integral más estrecho, al que se promovería int
). Sería un error pasar long
, size_t
, etc.
%s
, es imprimir una subcadena de la cadena original. En este caso de uso, str
apuntaría 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.
Más detallado aquí .
valor entero o
*
que especifica el ancho mínimo del campo. El resultado se rellena con espacios (de forma predeterminada), si es necesario, a la izquierda cuando se justifica a la derecha, oa la derecha si se justifica a la izquierda. En el caso de que se utilice *, el ancho se especifica mediante un argumento adicional de tipo int. Si el valor del argumento es negativo, resulta con el indicador - especificado y un ancho de campo positivo. (Nota: este es el ancho mínimo: el valor nunca se trunca).
.
seguido de un número entero o *, o ninguno que especifique la precisión de la conversión. En el caso de que se utilice *, la precisión se especifica mediante un argumento adicional de tipo int. Si el valor de este argumento es negativo, se ignora. Si no se utiliza un número ni *, la precisión se toma como cero. Consulte la tabla siguiente para conocer los efectos exactos de la precisión.
Entonces, si probamos ambas especificaciones de conversión
#include <stdio.h>
int main() {
int precision = 8;
int biggerPrecision = 16;
const char *greetings = "Hello world";
printf("|%.8s|\n", greetings);
printf("|%.*s|\n", precision , greetings);
printf("|%16s|\n", greetings);
printf("|%*s|\n", biggerPrecision , greetings);
return 0;
}
obtenemos la salida:
|Hello wo|
|Hello wo|
| Hello world|
| Hello world|
No creo que el código anterior sea correcto, pero (de acuerdo con esta descripción de printf()
) los .*
medios
El ancho no se especifica en la cadena de formato, sino como un argumento de valor entero adicional que precede al argumento que tiene que formatearse. '
Entonces es una cadena con un ancho aceptable como argumento.
int
(o un subconjunto de él), no cualquier valor integral como más intuitivo size_t
o sus posibles alias, como std::string::size_type
. Esto es aún más confuso, teniendo en cuenta que la página a la que se hace referencia se menciona size_t
como uno de los especificadores de tipo admitidos.
Ver: http://www.cplusplus.com/reference/clibrary/cstdio/printf/
.*
La precisión no se especifica en la cadena de formato, sino como un argumento de valor entero adicional que precede al argumento que se debe formatear.
s
Cadena de caracteres
printf
llamada válida .