tipos sintaxis significa secuencias que formato especificadores escape datos c format specifier

significa - sintaxis de printf y scanf



¿Cómo escribiría un nuevo mi propio especificador de formato en C? (4)

Agregar un nuevo especificador implica volver a escribir printf() o crear su propia función que maneje el nuevo especificador así como printf() y llamar eso. Ambos enfoques son difíciles.

Una alternativa es usar "%s" y crear su propia función que forma una cadena.

Con C99 o posterior, use un literal compuesto para formar el espacio de búfer necesario.

#include <stdio.h> #define MYIP_N 16 #define MYIP(ip) myip((char [MYIP_N]){""}, (ip)) char *myip(char *dest, int ip) { snprintf(dest, MYIP_N, "%d.%d.%d.%d", (ip >> 24) & 255, (ip >> 16) & 255, (ip >> 8) & 255, (ip >> 0) & 255); return dest; } int main(void) { int ip1 = 0x01020304; int ip2 = 0x05060708; printf("%s %s/n", MYIP(ip1), MYIP(ip2)); return 0; }

Salida

1.2.3.4 5.6.7.8

Esto funciona con printf() o fprintf() , sprintf() , incluso puts()

puts(MYIP(ip1)); 1.2.3.4

¿Es posible escribir un nuevo especificador de formato en C? Por ejemplo, digamos,% g es un especificador de formato que imprime la dirección IP en formato ABCD a partir del entero equivalente sin signo.

int ip_addr = Some integer printf("ip address = %g", ip_addr);

salida: imprime la dirección IP en formato ABCD


No puede cambiar las funciones estándar de la biblioteca aunque puede escribir una función contenedora que aceptará %g y, a su vez, llamará a printf .


Tendría que volver a implementar la función printf (más precisamente su función de análisis de formato). Lo que puede hacer es ajustar printf dentro de una función que admita direcciones IP o hacer esto:

#define FMT_IP "%d.%d.%d.%d" #define FMT_IP_ARG(ip) getA(ip), getB(ip), getC(ip), getD(ip)

Donde las funciones getX o macros obtienen la parte X del entero dado que representa una dirección IP.

Entonces:

printf("ip address = " FMT_IP "/n", FMT_IP_ARG(ip));


Buscaría la respuesta de @chux , que es simple y portátil siempre que pueda saber qué tan grande es el buffer temporal que necesita.

Sin embargo, si está utilizando la biblioteca GNU (glibc), puede ampliar printf con nuevos especificadores. Se recomienda encarecidamente que utilice letras mayúsculas como códigos de formato, ya que casi todos los códigos de formato en minúsculas están en uso y el resto puede ser utilizado por los futuros estándares de C / Posix. La instalación está documentada en el manual de glibc .

Basado en la instalación de GNU, se escribió una instalación similar bastante compatible para la biblioteca BSD. Aparentemente, está disponible en Mac OS X, aunque no puedo responder por ese hecho. Lo encontré en las páginas Man de Man en línea para xprintf (3) y xprintf (5) .

Hay ejemplos en la documentación vinculada anteriormente.