¿Qué significa “%. * S” como un especificador de formato en printf?

¿Alguien puede decirme qué significa esto: "%.*s"

Por ejemplo, está en uso aquí:

  sprintf(outv->deliveryAddressCity, "%.*s", sizeof(outv->deliveryAddressCity)-1, mi->deliveryAddressCity); 

%.*s significa imprimir el primer número X de caracteres del siguiente búfer . En este caso, imprima el primer sizeof(outv->deliveryAddressCity) - 1 caracteres de mi->deliveryAddressCity , evitando escribir más allá de los límites de outv->deliveryAddressCity .

Un ejemplo más corto:

 printf("%.*s", 4, "hello world"); 

imprimiría el hell

.* 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.

En su caso, el tamaño de la cadena es sizeof(outv->deliveryAddressCity )-1

Tal vez puedas obtenerlo con este ejemplo:

 printf("%.*s", 3, "abcdef"); 

grabados “abc”.

Los parámetros de formato de ancho y precisión pueden omitirse, o pueden ser un número fijo incrustado en la cadena de formato, o pasarse como otro argumento de función cuando se indica con un asterisco “*” en la cadena de formato. Por ejemplo, printf (“% * d”, 5, 10) dará como resultado que se imprima “10”, con un ancho total de 5 caracteres, y printf (“%. * S”, 3, “abcdef”) resultará en Se está imprimiendo “abc”.

(Fue realmente fácil encontrarlo en un motor de búsqueda …)

Se usa más comúnmente cuando tienes una cadena que no está terminada en nulo y la longitud se almacena en otro lugar.

Por ejemplo:

 { char* regular_string = "Hello World"; // This string has a null-Terminator. char untermed_string[11]; int len; // Specifically make untermed string so it is NOT null-terminated. memcpy(untermed_string, regular_string, 11); len = 11; printf("The string is %.*s\n", len, untermed_string); // This will still print the proper data! printf("The start of the string is %.*s\n", 5, untermed_string); // This will only print "Hello". } 

este es un especificador de formato, que toma 2 valores de la stack, el primero es el tamaño, el segundo el valor.

La.-Notación: atleast-length.maxlength (por lo que “. *” Significa: max * caracteres)

Te ayuda a imprimir la parte de la cadena. u puede especificar hasta qué longitud u tiene que imprimir la cadena. ejemplo: printf (“%. * s”, 5,, “rahul subedi”) salida: rahul