Definido en el encabezado
intprintf(constchar* format,...);
(1)
intfprintf( std::FILE* stream,constchar* format,...);
(2)
intsprintf(char* buffer,constchar* format,...);
(3)
intsnprintf(char* buffer, std::size_t buf_size,constchar* format,...);
(4) (desde C ++ 11)

Carga los datos de las ubicaciones dadas, los convierte en equivalentes de cadenas de caracteres y escribe los resultados en una variedad de receptores.

1) Escribe los resultados en stdout.2) Escribe los resultados en una secuencia de archivos. stream.3) Escribe los resultados en una cadena de caracteres. buffer.4) Escribe los resultados en una cadena de caracteres. buffer. A lo sumo buf_size – Se escriben 1 caracteres. La cadena de caracteres resultante terminará con un carácter nulo, a menos que buf_size es cero. Si buf_size es cero, no hay nada escrito y buffer puede ser un puntero nulo, sin embargo, el valor de retorno (número de bytes que se escribirían sin incluir el terminador nulo) aún se calcula y devuelve.

Si una llamada a sprintf o snprintf hace que la copia se lleve a cabo entre objetos que se superponen, el comportamiento no está definido (p. ej. sprintf(buf, "%s text", buf);).

Parámetros

Arroyo flujo de archivo de salida para escribir
buffer puntero a una cadena de caracteres para escribir
buf_size hasta buf_size: se pueden escribir 1 caracteres, más el terminador nulo
formato puntero a una cadena multibyte terminada en nulo que especifica cómo interpretar los datos.

La cadena de formato consta de caracteres multibyte ordinarios (excepto %), que se copian sin cambios en el flujo de salida y las especificaciones de conversión. Cada especificación de conversión tiene el siguiente formato:

  • introductorio % personaje
  • (Opcional) una o más banderas que modifican el comportamiento de la conversión:
    • -: el resultado de la conversión se justifica a la izquierda dentro del campo (de forma predeterminada, se justifica a la derecha)
    • +: el signo de las conversiones con signo siempre se antepone al resultado de la conversión (de forma predeterminada, el resultado está precedido por un signo menos solo cuando es negativo)
    • espacio: si el resultado de una conversión con signo no comienza con un carácter de signo, o está vacío, se antepone un espacio al resultado. Se ignora si + la bandera está presente.
    • # : forma alternativa de la conversión se realiza. Consulte la tabla a continuación para conocer los efectos exactos; de lo contrario, el comportamiento no está definido.
    • 0 : para conversiones de números enteros y de coma flotante, se utilizan ceros a la izquierda para rellenar el campo en lugar de espacio caracteres. Para números enteros, se ignora si la precisión se especifica explícitamente. Para otras conversiones, el uso de esta marca da como resultado un comportamiento indefinido. Se ignora si - la bandera está presente.
  • (Opcional) valor entero o * que especifica el ancho mínimo del campo. El resultado se rellena con espacio caracteres (por defecto), si es necesario, a la izquierda cuando se justifica a la derecha, oa la derecha si se justifica a la izquierda. En el caso cuando * se utiliza, el ancho se especifica mediante un argumento adicional de tipo int. Si el valor del argumento es negativo, resulta con el - bandera especificada y ancho de campo positivo. (Nota: este es el ancho mínimo: el valor nunca se trunca).
    • (Opcional). seguido de un número entero o *, o ninguno que especifique precisión de la conversión. En el caso cuando * se utiliza, el precisión se especifica mediante un argumento adicional de tipo int. Si el valor de este argumento es negativo, se ignora. Si ni un número ni * se utiliza, la precisión se toma como cero. Consulte la tabla a continuación para conocer los efectos exactos de precisión.
    • (Opcional)modificador de longitud que especifica el tamaño del argumento
    • especificador de formato de conversión

Están disponibles los siguientes especificadores de formato:

Conversión
especificador
Explicación Tipo de argumento
modificador de longitud hh

(C ++ 11).

h (ninguno) l ll

(C ++ 11).

j

(C ++ 11).

z

(C ++ 11).

t

(C ++ 11).

L
% escribe literal %. La especificación de conversión completa debe ser %%. N / A N / A N / A N / A N / A N / A N / A N / A N / A
c escribe un carácter único.

El argumento se convierte primero en unsigned char. Si el l se utiliza el modificador, el argumento se convierte primero en una cadena de caracteres como si % ls con un wchar_t[2] argumento.

N / A N / A int wint_t N / A N / A N / A N / A N / A
s escribe un cadena de caracteres

El argumento debe ser un puntero al elemento inicial de una matriz de caracteres. Precisión especifica el número máximo de bytes que se escribirán. Si Precisión no se especifica, escribe cada byte hasta el primer terminador nulo y sin incluirlo. Si el l se utiliza un especificador, el argumento debe ser un puntero al elemento inicial de una matriz de wchar_t, que se convierte en una matriz de caracteres como si fuera una llamada a wcrtomb con estado de conversión inicializado cero.

N / A N / A char* wchar_t* N / A N / A N / A N / A N / A
d
i
convierte un entero con signo en representación decimal [-]dddd.

Precisión especifica el número mínimo de dígitos que aparecerán. La precisión predeterminada es 1.
Si tanto el valor convertido como la precisión son ​0​ la conversión no da como resultado caracteres.

signed char short int long long long intmax_t firmado size_t ptrdiff_t N / A
o convierte un entero sin signo en representación octal oooo.

Precisión especifica el número mínimo de dígitos que aparecerán. La precisión predeterminada es 1. Si tanto el valor convertido como la precisión son ​0​ la conversión no da como resultado caracteres. En el implementación alternativa la precisión se incrementa si es necesario, para escribir un cero a la izquierda. En ese caso, si tanto el valor convertido como la precisión son ​0​, soltero ​0​ está escrito.

unsigned char unsigned short unsigned int unsigned long unsigned long long uintmax_t size_t versión sin firmar de ptrdiff_t N / A
x
X
convierte un entero sin signo en representación hexadecimal hhhh.

Para el x letras de conversión abcdef son usados.
Para el X letras de conversión ABCDEF son usados.
Precisión especifica el número mínimo de dígitos que aparecerán. La precisión predeterminada es 1. Si tanto el valor convertido como la precisión son ​0​ la conversión no da como resultado caracteres. En el implementación alternativa0x o 0X se antepone a los resultados si el valor convertido es distinto de cero.

N / A
u convierte un entero sin signo en representación decimal dddd.

Precisión especifica el número mínimo de dígitos que aparecerán. La precisión predeterminada es 1. Si tanto el valor convertido como la precisión son ​0​ la conversión no da como resultado caracteres.

N / A
f
F
convierte número de coma flotante a la notación decimal en el estilo [-]ddd.ddd.

Precisión especifica el número mínimo de dígitos que aparecerán después del carácter del punto decimal. La precisión predeterminada es 6. En el implementación alternativa El carácter de punto decimal se escribe incluso si no le siguen dígitos. Para el estilo de conversión infinito y no numérico, consulte las notas.

N / A N / A double double(C ++ 11) N / A N / A N / A N / A long double
e
E
convierte número de coma flotante a la notación de exponente decimal.

Para el e estilo de conversión [-]d.ddde± dd se utiliza.
Para el E estilo de conversión [-]d.dddE± dd se utiliza.
El exponente contiene al menos dos dígitos, se usan más dígitos solo si es necesario. Si el valor es ​0​, el exponente también es ​0​. Precisión especifica el número mínimo de dígitos que aparecerán después del carácter del punto decimal. La precisión predeterminada es 6. En el implementación alternativa El carácter de punto decimal se escribe incluso si no le siguen dígitos. Para el estilo de conversión infinito y no numérico, consulte las notas.

N / A N / A N / A N / A N / A N / A
a
A

(C ++ 11).

convierte número de coma flotante a la notación exponencial hexadecimal.

Para el a estilo de conversión [-]0xh.hhhp± d se utiliza.
Para el A estilo de conversión [-]0Xh.hhhP± d se utiliza.
El primer dígito hexadecimal no es 0 si el argumento es un valor de coma flotante normalizado. Si el valor es ​0​, el exponente también es ​0​. Precisión especifica el número mínimo de dígitos que aparecerán después del carácter del punto decimal. La precisión predeterminada es suficiente para una representación exacta del valor. En el implementación alternativa El carácter de punto decimal se escribe incluso si no le siguen dígitos. Para el estilo de conversión infinito y no numérico, consulte las notas.

N / A N / A N / A N / A N / A N / A
g
G
convierte número de coma flotante a decimal o notación de exponente decimal dependiendo del valor y la precisión.

Para el g conversión de estilo conversión con estilo e o f será realizado.
Para el G conversión de estilo conversión con estilo E o F será realizado.
Dejar P igual a la precisión si no es cero, 6 si no se especifica la precisión, o 1 si la precisión es ​0​. Entonces, si una conversión con estilo E tendría un exponente de X:

  • si P> X ≥ −4, la conversión es con estilo f o F y precisión P – 1 – X.
  • de lo contrario, la conversión es con estilo. e o E y precisión P – 1.

A no ser que representación alternativa Si se solicita que se eliminen los ceros finales, también se elimina el carácter del punto decimal si no queda ninguna fracción. Para el estilo de conversión infinito y no numérico, consulte las notas.

N / A N / A N / A N / A N / A N / A
n devuelve el número de caracteres escritos hasta ahora por esta llamada a la función.

El resultado es escrito al valor apuntado por el argumento. Es posible que la especificación no contenga bandera, ancho de campo, o precisión.

signed char* short* int* long* long long* intmax_t* firmado size_t* ptrdiff_t* N / A
p escribe una secuencia de caracteres definida por la implementación que define un puntero. N / A N / A void* N / A N / A N / A N / A N / A N / A

Las funciones de conversión de punto flotante convierten el infinito en inf o infinity. Cuál se utiliza está definido por la implementación.

Not-a-number se convierte en nan o nan(char_sequence). Cuál se utiliza está definido por la implementación.

Las conversiones F, E, G, A producción INF, INFINITY, NAN en lugar de.

Aunque %c espera int argumento, es seguro pasar un char debido a la promoción de enteros que tiene lugar cuando se llama a una función variada.

Las especificaciones de conversión correctas para los tipos de caracteres de ancho fijo (int8_t, etc.) se definen en el encabezado (a pesar de que PRIdMAX, PRIuMAX, etc es sinónimo de %jd, %ju, etc.).

El especificador de conversión de escritura de memoria %n es un objetivo común de las vulnerabilidades de seguridad donde las cadenas de formato dependen de la entrada del usuario y no son compatibles con los límites comprobados printf_s familia de funciones.

Hay un punto de secuencia después de la acción de cada especificador de conversión; esto permite almacenar múltiples %n da como resultado la misma variable o, como caso límite, imprimir una cadena modificada por una %n dentro de la misma convocatoria.

Si una especificación de conversión no es válida, el comportamiento no está definido.

argumentos que especifican datos para imprimir. Si algún argumento después de las conversiones predeterminadas no es del tipo esperado por el especificador de conversión correspondiente, o si hay menos argumentos de los requeridos por format, el comportamiento no está definido. Si hay más argumentos de los requeridos por format, los argumentos extraños se evalúan e ignoran

Valor devuelto

1-2) Número de caracteres escritos si tiene éxito o un valor negativo si ocurrió un error.3) Número de caracteres escritos si tiene éxito (sin incluir el carácter nulo de terminación) o un valor negativo si ocurrió un error.4) Número de caracteres que se habrían escrito para un búfer suficientemente grande si tuviera éxito (sin incluir el carácter nulo de terminación), o un valor negativo si ocurriera un error. Por lo tanto, la salida (terminada en nulo) se ha escrito completamente si y solo si el valor devuelto es no negativo y menor que buf_size.

Notas

POSIX especifica ese errno se establece en error. También especifica especificaciones de conversión adicionales, sobre todo la compatibilidad con el reordenamiento de argumentos (n$ inmediatamente despues % indica n‘th argumento).

Vocación std::snprintf con cero buf_size y puntero nulo para buffer es útil para determinar el tamaño de búfer necesario para contener la salida:

constchar*fmt ="sqrt(2) = %f";int sz = std::snprintf(nullptr,0, fmt, std::sqrt(2));
std::vector<char>buf(sz +1);// note +1 for null terminator
std::snprintf(&buf[0], buf.size(), fmt, std::sqrt(2));

Ejemplo

#include#include#include#includeintmain()
    std::printf("Strings:n");constchar* s ="Hello";
    std::printf("t[%10s]nt[%-10s]nt[%*s]nt[%-10.*s]nt[%-*.*s]n",
        s, s,10, s,4, s,10,4, s);
 
    std::printf("Characters:t%c %%n",65);
 
    std::printf("Integersn");
    std::printf("Decimal:t%i %d %.6i %i %.0i %+i %in",1,2,3,0,0,4,-4);
    std::printf("Hexadecimal:t%x %x %X %#xn",5,10,10,6);
    std::printf("Octal:t%o %#o %#on",10,10,4);
 
    std::printf("Floating pointn");
    std::printf("Rounding:t%f %.0f %.32fn",1.5,1.5,1.3);
    std::printf("Padding:t%05.2f %.2f %5.2fn",1.5,1.5,1.5);
    std::printf("Scientific:t%E %en",1.5,1.5);
    std::printf("Hexadecimal:t%a %An",1.5,1.5);
    std::printf("Special values:t0/0=%g 1/0=%gn",0.0/0.0,1.0/0.0);
 
    std::printf("Variable width control:n");
    std::printf("right-justified variable width: '%*c'n",5,'x');int r = std::printf("left-justified variable width : '%*c'n",-5,'x');
    std::printf("(the last printf printed %d characters)n", r);// fixed-width types
    std::uint32_t val = std::numeric_limits<std::uint32_t>::max();
    std::printf("Largest 32-bit value is %" PRIu32 " or %#" PRIx32 "n", val, val);

Producción:

Strings:[     Hello][Hello     ][     Hello][Hell      ][Hell      ]
Characters:     A %
Integers
Decimal:120000030+4-4
Hexadecimal:5 a A 0x6
Octal:1201204
Floating point
Rounding:1.50000021.30000000000000004440892098500626
Padding:01.501.501.50
Scientific:1.500000E+001.500000e+00
Hexadecimal:0x1.8p+00X1.8P+0
Special values:0/0=nan 1/0=inf
Variable width control:
right-justified variable width:'    x'
left-justified variable width :'x    '(the last printf printed 40 characters)
Largest 32-bit value is 4294967295 or 0xffffffff

Ver también

wprintffwprintfswprintf imprime la salida de caracteres anchos formateados a stdout, una secuencia de archivos o un búfer
(función)
vprintfvfprintfvsprintfvsnprintf(C ++ 11) imprime salida formateada a stdout, una secuencia de archivos o un búfer
usando la lista de argumentos variables
(función)
fputs escribe una cadena de caracteres en una secuencia de archivos
(función)
scanffscanfsscanf lee la entrada formateada de stdin, una secuencia de archivos o un búfer
(función)
to_chars(C ++ 17) convierte un valor entero o de punto flotante en una secuencia de caracteres
(función)