std:: printf, std:: fprintf, std:: sprintf, std:: snprintf
|
Definido en el encabezado
<cstdio>
|
||
|
int
printf
(
const
char
*
format, ...
)
;
|
(1) | |
|
int
fprintf
(
std::
FILE
*
stream,
const
char
*
format, ...
)
;
|
(2) | |
|
int
sprintf
(
char
*
buffer,
const
char
*
format, ...
)
;
|
(3) | |
|
int
snprintf
(
char
*
buffer,
std::
size_t
buf_size,
const
char
*
format, ...
)
;
|
(4) | (desde C++11) |
Carga los datos desde las ubicaciones dadas, los convierte a equivalentes de cadena de caracteres y escribe los resultados en una variedad de destinos.
Si una llamada a
sprintf
o
snprintf
provoca que se realice una copia entre objetos que se superponen, el comportamiento es indefinido (por ejemplo,
sprintf
(
buf,
"%s text"
, buf
)
;
).
Contenidos |
Parámetros
| stream | - | flujo de archivo de salida en el que escribir |
| buffer | - | puntero a una cadena de caracteres en la que escribir |
| buf_size | - | hasta buf_size - 1 caracteres pueden escribirse, más el terminador nulo |
| format | - | puntero a una cadena multibyte terminada en nulo que especifica cómo interpretar los datos |
| ... | - | argumentos que especifican los datos a imprimir. Si cualquier argumento después de las promociones de argumentos predeterminadas no es del tipo esperado por la especificación de conversión correspondiente (el tipo esperado es el tipo promocionado o un tipo compatible del tipo promocionado), o si hay menos argumentos de los requeridos por format , el comportamiento es indefinido. Si hay más argumentos de los requeridos por format , los argumentos excedentes se evalúan y se ignoran |
La cadena de
formato
consiste en caracteres de byte ordinarios (excepto
%
), que se copian sin cambios en el flujo de salida, y especificaciones de conversión. Cada especificación de conversión tiene el siguiente formato:
-
-
carácter introductorio
%.
-
carácter introductorio
-
- (opcional) uno o más indicadores que modifican el comportamiento de la conversión:
-
-
-: el resultado de la conversión se justifica a la izquierda dentro del campo (por defecto se justifica a la derecha). -
+: el signo de las conversiones con signo siempre se antepone al resultado de la conversión (por defecto el resultado se precede con 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 el indicador
+está presente. -
#: se realiza la forma alternativa de la conversión. Consulte la tabla siguiente para conocer los efectos exactos, de lo contrario el comportamiento es indefinido. -
0: para conversiones de números enteros y de punto flotante, se utilizan ceros iniciales para rellenar el campo en lugar de caracteres de espacio . Para números enteros se ignora si la precisión se especifica explícitamente. Para otras conversiones, el uso de este indicador da como resultado un comportamiento indefinido. Se ignora si el indicador-está presente.
-
-
-
(opcional)
valor entero o
*que especifica el ancho mínimo del campo. El resultado se rellena con caracteres de espacio (por defecto), si es necesario, a la izquierda cuando está justificado a la derecha, o a la derecha si está justificado a la izquierda. En el caso cuando se utiliza*, el ancho se especifica mediante un argumento adicional de tipo int , que aparece antes del argumento a convertir y del argumento que suministra la precisión si se proporciona uno. Si el valor del argumento es negativo, resulta con el indicador-especificado y ancho de campo positivo (Nota: Este es el ancho mínimo: El valor nunca se trunca.).
-
(opcional)
valor entero o
-
-
(opcional)
.seguido de un número entero o*, o ninguno que especifique la precisión de la conversión. En el caso cuando se utiliza*, la precisión se especifica mediante un argumento adicional de tipo int , que aparece antes del argumento a convertir, pero después del argumento que suministra el ancho mínimo del campo si se suministra uno. Si el valor de este argumento es negativo, se ignora. Si no se utiliza ni un número ni*, la precisión se toma como cero. Consulte la tabla siguiente para conocer los efectos exactos de la precisión .
-
(opcional)
-
- (opcional) modificador de longitud que especifica el tamaño del argumento (en combinación con el especificador de formato de conversión, especifica el tipo del argumento correspondiente).
-
- especificador de formato de conversión.
Los siguientes especificadores de formato están disponibles:
|
Especificador
de Conversión |
Explicación |
Tipo de
Argumento Esperado |
||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Modificador de Longitud→ | hh | h | ninguno | l | ll | j | z | t | L | |
| Solo disponible desde C++11→ | Sí | Sí | Sí | Sí | Sí | |||||
%
|
Escribe literalmente
%
. 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 .
|
N/A | N/A |
int
|
std::wint_t
|
N/A | N/A | N/A | N/A | N/A |
s
|
Escribe una cadena de caracteres .
|
N/A | N/A |
char
*
|
wchar_t
*
|
N/A | N/A | N/A | N/A | N/A |
d
i
|
Convierte un entero con signo a representación decimal [-]dddd .
|
signed
char
|
short
|
int
|
long
|
long
long
|
※
|
N/A | ||
o
|
Convierte un entero sin signo a representación octal oooo .
|
unsigned
char
|
unsigned
short
|
unsigned
int
|
unsigned
long
|
unsigned
long
long
|
versión sin signo de
std::ptrdiff_t
|
N/A | ||
x
X
|
Convierte un entero sin signo a representación hexadecimal hhhh .
|
N/A | ||||||||
u
|
Convierte un entero sin signo a representación decimal dddd .
|
N/A | ||||||||
f
F
(C++11)
|
Convierte números de punto flotante a la notación decimal en el estilo [-]ddd.ddd .
|
N/A | N/A |
double
|
double
(C++11)
|
N/A | N/A | N/A | N/A |
long
double
|
e
E
|
Convierte números de punto flotante a notación exponencial decimal.
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
a
A
(C++11) |
Convierte números de punto flotante a la notación exponencial hexadecimal.
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
g
G
|
Convierte un número de punto flotante a notación decimal o notación exponencial decimal dependiendo del valor y la precisión .
|
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.
|
signed
char
*
|
short
*
|
int
*
|
long
*
|
long
long
*
|
※
|
N/A | ||
p
|
Escribe una secuencia de caracteres definida por la implementación que define un pointer . |
N/A | N/A |
void
*
|
N/A | N/A | N/A | N/A | N/A | N/A |
| Notas | ||||||||||
|
Las funciones de conversión de punto flotante convierten infinito a
No-es-un-número se convierte a
Las conversiones
El especificador de conversión utilizado para imprimir char , unsigned char , signed char , short , y unsigned short espera tipos promocionados de promociones de argumentos por defecto , pero antes de imprimir su valor será convertido a char , unsigned char , signed char , short , y unsigned short . Es seguro pasar valores de estos tipos debido a la promoción que tiene lugar cuando se llama a una función variádica.
Las especificaciones de conversión correctas para los tipos de caracteres de ancho fijo (
std::int8_t
, etc) están definidas en el encabezado
<cinttypes>
(aunque
PRIdMAX
,
PRIuMAX
, etc son sinónimos de
El especificador de conversión de escritura en memoria
Hay un
punto de secuencia
después de la acción de cada especificador de conversión; esto permite almacenar múltiples resultados
Si una especificación de conversión es inválida, el comportamiento es indefinido. |
||||||||||
Valor de retorno
Notas
POSIX especifica
que
errno
se establece en caso de error. También especifica especificadores de conversión adicionales, más notablemente soporte para reordenamiento de argumentos (
n$
inmediatamente después de
%
indica el
n
ésimo
argumento).
Llamar a
std::snprintf
con tamaño de búfer cero
buf_size
y puntero nulo para
buffer
es útil (cuando la sobrecarga de la doble llamada es aceptable) para determinar el tamaño necesario del búfer para contener la salida:
auto fmt = "sqrt(2) = %f"; int sz = std::snprintf(nullptr, 0, fmt, std::sqrt(2)); std::vector<char> buf(sz + 1); // nota: +1 para el terminador nulo std::sprintf(buf.data(), fmt, std::sqrt(2)); // seguro que cabe
Ejemplo
#include <cinttypes> #include <cstdint> #include <cstdio> #include <limits> int main() { const char* s = "Hello"; std::printf("Strings:\n"); // same as std::puts("Strings:"); std::printf("\t[%10s]\n", s); std::printf("\t[%-10s]\n", s); std::printf("\t[%*s]\n", 10, s); std::printf("\t[%-10.*s]\n", 4, s); std::printf("\t[%-*.*s]\n", 10, 4, s); std::printf("Characters:\t%c %%\n", 'A'); std::printf("Integers:\n"); std::printf("\tDecimal: \t%i %d %.6i %i %.0i %+i %i\n", 1, 2, 3, 0, 0, 4,-4); std::printf("\tHexadecimal:\t%x %x %X %#x\n", 5,10,10, 6); std::printf("\tOctal: \t%o %#o %#o\n", 10, 10, 4); std::printf("Floating point:\n"); std::printf("\tRounding:\t%f %.0f %.32f\n", 1.5, 1.5, 1.3); std::printf("\tPadding:\t%05.2f %.2f %5.2f\n", 1.5, 1.5, 1.5); std::printf("\tScientific:\t%E %e\n", 1.5, 1.5); std::printf("\tHexadecimal:\t%a %A\n", 1.5, 1.5); std::printf("\tSpecial values:\t0/0=%g 1/0=%g\n", 0.0/0.0, 1.0/0.0); std::printf("Variable width control:\n"); std::printf("\tright-justified variable width: '%*c'\n", 5, 'x'); int r = std::printf("\tleft-justified variable width : '%*c'\n", -5, 'x'); std::printf("(the last printf printed %d characters)\n", r); std::printf("Fixed-width types:\n"); std::uint32_t val = std::numeric_limits<std::uint32_t>::max(); std::printf("\tLargest 32-bit value is %" PRIu32 " or %#" PRIx32 "\n", val, val); }
Salida posible:
Strings: [ Hello] [Hello ] [ Hello] [Hell ] [Hell ] Characters: A % Integers: Decimal: 1 2 000003 0 +4 -4 Hexadecimal: 5 a A 0x6 Octal: 12 012 04 Floating point: Rounding: 1.500000 2 1.30000000000000004440892098500626 Padding: 01.50 1.50 1.50 Scientific: 1.500000E+00 1.500000e+00 Hexadecimal: 0x1.8p+0 0X1.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 41 characters) Fixed-width types: Largest 32-bit value is 4294967295 or 0xffffffff
Véase también
|
imprime salida formateada de caracteres anchos hacia
stdout
, un flujo de archivo o un búfer
(función) |
|
|
imprime salida formateada hacia
stdout
, un flujo de archivo o un búfer
usando una lista de argumentos variables (función) |
|
|
escribe una cadena de caracteres a un flujo de archivo
(función) |
|
|
lee entrada formateada desde
stdin
, un flujo de archivo o un búfer
(función) |
|
|
(C++17)
|
convierte un valor entero o de punto flotante a una secuencia de caracteres
(función) |
|
(C++23)
|
imprime hacia
stdout
o un flujo de archivo usando
representación formateada
de los argumentos
(plantilla de función) |
|
(C++23)
|
igual que
std::print
excepto que cada impresión termina con una nueva línea adicional
(plantilla de función) |
|
Documentación C
para
printf
,
fprintf
,
sprintf
,
snprintf
|
|