PRINTF(3)

NOMBRE
printf, fprintf, sprintf, vprintf, vfprintf, vsprintf - conversión de salida formateada

SINOPSIS
#include <stdio.h>

int printf( const char *format, ...);
int fprintf( FILE *stream, const char *format, ...);
int sprintf( char *str, const char *format, ...);

#include <stdarg.h>

int vprintf( const char *format, va_list ap);
int vfprintf( FILE *stream, const char *format, va_list ap);
int vsprintf( char *str, char *format, va_list ap);

DESCRIPCION
La familia de funciones printf produce una salida de acuerdo a format como se describe abajo. Printf y vprintf escriben su salida a stdout, la corriente (stream) de salida estandar; fprintf y vfprintf escriben su salida a la stream dada ; sprintf, y vsprintf escriben a una cadena de caracteres str. Todas estas funciones escriben la salida bajo el control de una cadena format que especifica como los subsecuentes argumentos (o argumentos accedidos via las facilidades de argumentos de longitud variables de stdarg(3) son convertidos para su salida. Estas funciones retornan el número de caracteres impresos (no incluyendo el delimitador `\0' usado para terminar la salida de cadenas).

La cadena format está compuesta de cero o más directivas: caracteres ordinarios (no %), que son copiados sin cambios a la corriente (stream) de salida; y especificaciones de conversión, cada una de las que resulta en ir a buscar cero o más subsecuentes argumentos. Cada especificación de conversión es introducida por el caracter %. Los argumentos deben corresponder adecuadamente según la conversión especificada. Luego de %, los siguientes caracteres pueden aparecer en secuencia:

•   Cero o más de las siguientes banderas:

    #   especificando que el valor debe ser convertido a un ``formato alternativo''. Para las conversiones c, d, i, n, p, s, y u , esta opción no tiene efecto. Para la conversión o , la precisión del número es incrementada para forzar el primer caracterer de la cadena de salida a cero ( excepto que un valor cero sea impreso con una explícita precisión de cero). Para conversiones x y X , un resultado distinto de cero tiene la cadena `0x' (o `0X' para conversiones X ) precediendola. Para conversiones e, E, f, g, y G , el resultado siempre contendrá un punto decimal, aún si ningún dígito lo sigue ( normalmente, un punto decimal aparece solamente en el resultado de aquellas conversiones que son seguidas de algún dígito). Para conversiones g y G , los ceros finales (trailing zeros) no son removidos del resultado.

    0   especificando el relleno con ceros. Para todas las converiones excepto n, el valor convertido es rellenado a la izquierda con ceros en vez de blancos. Si una precisión es dada con una conversión numérica (d, i, o, u, i, x, y X), la bandera 0 es ignorada.

    -   (un campo negativo como flag) indica que el valor convertido es justificado a la izquierda sobre el límite del campo. Excepto para conversiones n , el valor convertido es rellenado a la derecha con blancos, en vez de a la izquierda con blancos o ceros. Un - sobreescribe un 0 si ambos son dados.

        (un espacio) especifica que un blanco debe ser dejado antes de que un número positivo sea producido por una conversión de signo (d, e, E, f, g, G, o i).

    +   especifica que el signo siempre sera ubicado antes de un número producido pora una conversión con signo. Un + sobreescribe un espacio si ambos son usados.

•   Una cadena de dígitos decimales opcionales especifican un ancho de campo mínimo, este puede ser rellenado con espacios a la izquierda (o derecha, si el flag de justificado a la izquierda a sido dado) para llenar el ancho del campo.

•   Una opcional precisión, con formato de un punto (`.') seguido por una cadena de dígitos opcionales. Si la cadena de dígitos es omitida, la precisición es tomada como cero. Esto da el mínimo número de dígitos para aparecer en las conversiones d, i, o, u, x, y X , el número de dígitos para aparecer luego del punto decimal para las conversiones e, E, y f , el máximo número de dígitos signifiativos para las conversiones g y G , o el máximo número de caracteres a ser impresos desde una cadena para las conversiones s

•   El caracter opcional h, especifica que una de las siguientes d, i, o, u, x, o X corresponde a un argumento short int o unsigned short int , o que una conversión siguiente n corresponde a un puntero a un argumento short int

•   El caracter opcional l (ele) especifica que una de las siguinetes conversiones d, i, o, u, x, o X aplica a un puntero de argumento long int o unsigned long int , que una conversión siguiente n corresponde a un puntero de argumento long int

•   El caracter L espeficifa que una de las siguientes conversions e, E, f, g, o G corrsponde a un argumento long double

•   Un caracter que especifica el tipo de conversión a ser aplicado.

Un campo de ancho o precisión, o ambos, pueden ser indicados por un asterisco `*' a menos de una cadena de dígitos. En este caso, un argumento int suministra el campo de ancho o precisión. Un campo negativo es tratado como una bandera de justificado a la izquierda seguida por un campo de ancho positivo; una precisión negativa es tratada como si estuviese perdida.

Los especificadores de conversión y sus significados son:

diouxX
    El argumento int ( o la apropiada variante) es convertida a un decimal con signo (d y i), a octal sin signo (o, a decimal sin signo (u, a hexadecimal sin signo con notación (x y X) abcdef son usadas para conversiones x ; las letras ABCDEF son usadas para conversiones X si el valor convertido requiere menos dígitos, este es rellenado a la izquierda con ceros.

DOU El argumento long int es convertido a un decimal con signo, octal sin signo, o decimal sin signo, como si el formato haya sido ld, lo, o lu respectivamente. Esas conversiones caracter son despreciadas, y pueden eventualmente desaparecer.

eE  El argumento double es redondeado y convertido en un estilo [-]d.ddde\*(Pmdd donde hay un dígito antes del caracter del punto decimal y el número de dígitos despues de este es igual a la precisión; si la precisión esta perdida, es tomada como 6; si la precisión es cero, ningún caracter del punto decimal aparece. Una conversión E usa la letra E ( en vez de e) para introducir el exponente. El exponente siempre contiene al menos dos dígitos; si el valor es cero, el exponente es 00.

f   El argumento double es redondeado y convertido a una notación decimal del estilo [-]ddd.ddd, donde el número de dígitos luego del caracter del punto decimal es igual a la especificación de la precisión. Si la precisión esta perdida, es tomada como 6; si la precisión es cero, ningún caracter del punto decimal aparece. Si un punto decimal aparece, al menos un dígito aparece despues de este.

g   El argumento double es convertido al estilo de f o e (o E para conversiones G ). La precisión especifica el número de dígitos significativos. Si la precisión esta perdida, 6 dígitos son dados; si la precisión es cero, esta es tratada como 1. El estilo e es usado si el exponente para esta conversión es menor que -4 o más grande o igual a la precisión. Ceros finales son removidos de la parte fraccional del resultado; un punto decimal solo aparece si es seguido de al menos un dígito.

c   El argumento int es convertido a un unsigned char, y el caracter resultante es escrito.

s   El argumento ``char *'' es esperado como un tipo puntero a una cadena de caracteres. Caracteres del array son escritos hasta (pero no incluyendo) un caracter terminador NUL ; si una precisión es especificada, no más que el número especificado son escritos. Si una precisión es dada, ningún caracter nulo necesita estar presente; si la precisión no es specificada, o es más grande que el tamaño de la cadena, la cadena debe contener un caracter de terminación NUL

p   El argumento puntero ``void *'' es impreso en hexadecimal (como con %#x o %#lx).

n   El número de caracteres escritos hasta que es guardado en el entero indicado por el argumento ``int *'' (o la variante). Ningún argumento es convertido.

%   Un `%' es escrito. Ningún argumento es convertido. La completa especificación de conversión es `%%'.

En ningún caso un no existente o pequeño ancho de campo causa truncación del campo; si el resultado de una conversión es más ancho que el especificado, el campo es expandido para contener el resultado convertido.

EJEMPLOS
Para imprimir fecha y hora en la forma `Sunday, July 3, 10:02', donde weekday y month son punteros a cadenas:
    #include <stdio.h>
    fprintf(stdout, "%s, %s %d, %.2d:%.2d\n",
    	weekday, month, day, hour, min);

Para imprimir con cinco lugares decimales:
    #include <math.h>
    #include <stdio.h>
    fprintf(stdout, "pi = %.5f\n", 4 * atan(1.0));

Para alojar una cadena de 128 bytes e imprimirla:
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdarg.h>
    char *newfmt(const char *fmt, ...)
    {
    		char *p;
    		va_list ap;
    		if ((p = malloc(128)) == NULL)
    			return (NULL);
    		va_start(ap, fmt);
    		(void) vsnprintf(p, 128, fmt, ap);
    		va_end(ap);
    		return (p);
    }

VER TAMBIEN
printf(1), scanf(3)

STANDARDS
Las funciones fprintf, printf, sprintf, vprintf, vfprintf, y vsprintf estan conforme a ANSI C3.159-1989 (``ANSI C'').

BUGS
Algunas conversiones de punto flotante bajo Linux causan pérdidas de memoria.

Los formatos de conversiones %D, %O, y %U no son estandars y son provistos solo para compatibilidad hacia atrás. Pueden no ser provistas bajo Linux.

El efecto de relleno del formato %p con ceros (tanto por la bandera 0 o por especificar una precisión), y el benigno efecto (p.e., nada) de la bandera # activa con las conversiones %n y %p , como con otras combinaciones sin sentido como %Ld, no son estandars; dichas combinaciones pueden ser evitadas.

Como sprintf y vsprintf asumen una cadana de largo infinito, llamadores deben ser cuidadosos de no sobrepasar el espacio actual; esto es a menudo imposible de garantizar.