vprintf, vfprintf, vsprintf, vsnprintf, vprintf_s, vfprintf_s, vsprintf_s, vsnprintf_s
| Definido en el encabezado <stdio.h>
|
||
int vprintf( const char* format, va_list vlist );
|
(1) | (hasta C99) |
int vprintf( const char* restrict format, va_list vlist );
|
(desde C99) | |
int vfprintf( FILE* stream, const char* format, va_list vlist );
|
(2) | (hasta C99) |
int vfprintf( FILE* restrict stream, const char* restrict format,
va_list vlist );
|
(desde C99) | |
int vsprintf( char* buffer, const char* format, va_list vlist );
|
(3) | (hasta C99) |
int vsprintf( char* restrict buffer, const char* restrict format,
va_list vlist );
|
(desde C99) | |
int vsnprintf( char* restrict buffer, size_t bufsz,
const char* restrict format, va_list vlist );
|
(4) | (desde C99) |
int vprintf_s( const char* restrict format, va_list vlist );
|
(5) | (desde C11) |
int vfprintf_s( FILE* restrict stream, const char* restrict format,
va_list vlist );
|
(6) | (desde C11) |
int vsprintf_s( char* restrict buffer, rsize_t bufsz,
const char* restrict format, va_list vlist );
|
(7) | (desde C11) |
int vsnprintf_s( char* restrict buffer, rsize_t bufsz,
const char* restrict format, va_list vlist );
|
(8) | (desde C11) |
Carga los datos de las ubicaciones, definidas por vlist, los convierte a equivalentes de cadena de caracteres y escribe los resultados en una variedad de destinos.
stream.buffer.buffer. Como máximo se escriben bufsz - 1 caracteres. La cadena de caracteres resultante terminará con un carácter nulo, a menos que bufsz sea cero. Si bufsz es cero, no se escribe nada y buffer puede ser un puntero nulo, sin embargo el valor de retorno (número de bytes que se habrían escrito sin incluir el terminador nulo) aún se calcula y se devuelve.- el especificador de conversión
%nestá presente enformat - cualquiera de los argumentos correspondientes a
%ses un puntero nulo formatobufferes un puntero nulobufszes cero o mayor que RSIZE_MAX- ocurren errores de codificación en cualquiera de los especificadores de conversión de cadena y carácter
- (solo para
vsprintf_s), la cadena a almacenar enbuffer(incluyendo el nulo final) excederíabufsz
vprintf_s, vfprintf_s, vsprintf_s y vsnprintf_s solo se garantiza que estén disponibles si __STDC_LIB_EXT1__ está definido por la implementación y si el usuario define __STDC_WANT_LIB_EXT1__ como la constante entera 1 antes de incluir <stdio.h>.Parámetros
| stream | - | flujo de archivo de salida al que escribir |
| buffer | - | puntero a una cadena de caracteres a la que escribir |
| bufsz | - | hasta bufsz - 1 caracteres pueden ser escritos, más el terminador nulo
|
| format | - | puntero a una cadena de caracteres terminada en nulo que especifica cómo interpretar los datos |
| vlist | - | lista de argumentos variable que contiene los datos a imprimir. |
La cadena format consiste en caracteres de byte ordinarios (excepto %), que se copian sin cambios al 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) una o más banderas que modifican el comportamiento de la conversión:
--: el resultado de la conversión está alineado a la izquierda dentro del campo (por defecto está alineado a la derecha).++: el signo de las conversiones con signo siempre se antepone al resultado de la conversión (por defecto el resultado solo está precedido por un signo menos 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. ##: se realiza la forma alternativa de la conversión. Vea la tabla a continuación para efectos exactos; de lo contrario, el comportamiento no está definido.00: para conversiones de números enteros y de punto flotante, se usan ceros a la izquierda para rellenar el campo en lugar de caracteres espacio. Para números enteros se ignora si la precisión se especifica explícitamente. Para otras conversiones, usar esta bandera resulta en comportamiento no definido. Se ignora si la bandera-está presente.
- (opcional) valor entero o
*que especifica el ancho mínimo del campo. El resultado se rellena con caracteres espacio (por defecto), si es necesario, a la izquierda cuando está alineado a la derecha, o a la derecha si está alineado a la izquierda. En el caso de que se use*, el ancho se especifica mediante un argumento adicional de tipoint, que aparece antes del argumento a convertir y el argumento que suministra la precisión si se suministra uno. Si el valor del argumento es negativo, resulta en la bandera-especificada y un 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 especifica la precisión de la conversión. En el caso de que se use*, la precisión se especifica mediante un argumento adicional de tipoint, que aparece antes del argumento a convertir, pero después del argumento que suministra el ancho mínimo de campo si se suministra uno. Si el valor de este argumento es negativo, se ignora. Si no se usa ni un número ni*, la precisión se toma como cero. Vea la tabla a continuación para efectos exactos de 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:
| Conversión Especificador |
Explicación | Tipo de Argumento Esperado | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Modificador de Longitud→ | hh | h | ninguno | l | ll | j | z | t | L | |
| Solo disponible desde C99→ | Sí | Sí | Sí | Sí | Sí | |||||
%
|
Escribe el 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 individual.
|
N/A | N/A | int |
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 |
di
|
Convierte un entero con signo a representación decimal [-]dddd.
|
signed char |
short |
int |
long |
long long |
intmax_t |
※ |
ptrdiff_t |
N/A |
bB (opcional)
(C23) |
Convierte un entero sin signo a representación binaria bbbb.
|
unsigned char |
unsigned short |
unsigned int |
unsigned long |
unsigned long long |
uintmax_t |
size_t |
versión sin signo de ptrdiff_t |
N/A |
o
|
Convierte un entero sin signo a representación octal oooo.
|
N/A | ||||||||
xX
|
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 | ||||||||
fF (C99)
|
Convierte número de punto flotante a la notación decimal en el estilo [-]ddd.ddd.
|
N/A | N/A | double |
double (C99) |
N/A | N/A | N/A | N/A | long double |
eE
|
Convierte número de punto flotante a la notación de exponente decimal.
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
aA
(C99) |
Convierte número de punto flotante a la notación de exponente hexadecimal.
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
gG
|
Convierte número de punto flotante a notación decimal o de exponente 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* |
intmax_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 |
| Notas | ||||||||||
|
Las funciones de conversión de punto flotante convierten infinito a No un número se convierte a Las conversiones El especificador de conversión utilizado para imprimir Las especificaciones de conversión correctas para los tipos de caracteres de ancho fijo (int8_t, etc.) están definidas en el encabezado <inttypes.h> (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 no es válida, el comportamiento no está definido. | ||||||||||
Valor de retorno
buf_size, la función devuelve el número total de caracteres (sin incluir el byte nulo de terminación) que se habrían escrito si no se hubiera impuesto el límite.buffer, sin contar el carácter nulo (que siempre se escribe siempre que buffer no sea un puntero nulo y bufsz no sea cero y no sea mayor que RSIZE_MAX), o cero en violaciones de restricciones en tiempo de ejecución, y valor negativo en errores de codificaciónbuffer no sea un puntero nulo y bufsz no sea cero y no sea mayor que RSIZE_MAX), que se habrían escrito en buffer si bufsz se hubiera ignorado, o un valor negativo si ocurrió una violación de restricción en tiempo de ejecución o un error de codificaciónNotas
Todas estas funciones invocan va_arg al menos una vez, el valor de arg es indeterminado después del retorno. Estas funciones no invocan va_end, y debe ser hecho por quien llama.
vsnprintf_s, a diferencia de vsprintf_s, truncará el resultado para que quepa dentro del arreglo apuntado por buffer.
La implementación de vsnprintf_s en el Microsoft CRT no se ajusta al estándar C. La versión de Microsoft tiene un parámetro extra size_t count en la tercera posición que contiene la cantidad máxima de caracteres a escribir, sin incluir el terminador nulo. Este parámetro es posiblemente distinto del tamaño del búfer proporcionado a través del parámetro size_t bufsz.
Ejemplo
#include <stdarg.h>
#include <stdio.h>
#include <time.h>
void debug_log(const char* fmt, ...)
{
struct timespec ts;
timespec_get(&ts, TIME_UTC);
char time_buf[100];
size_t rc = strftime(time_buf, sizeof time_buf, "%D %T", gmtime(&ts.tv_sec));
snprintf(time_buf + rc, sizeof time_buf - rc, ".%06ld UTC", ts.tv_nsec / 1000);
va_list args1;
va_start(args1, fmt);
va_list args2;
va_copy(args2, args1);
char buf[1+vsnprintf(NULL, 0, fmt, args1)];
va_end(args1);
vsnprintf(buf, sizeof buf, fmt, args2);
va_end(args2);
printf("%s [debug]: %s\n", time_buf, buf);
}
int main(void)
{
debug_log("Logging, %d, %d, %d", 1, 2, 3);
}Posible salida:
02/20/15 21:58:09.072683 UTC [debug]: Logging, 1, 2, 3Referencias
- Estándar C23 (ISO/IEC 9899:2024):
- 7.21.6.8 The vfprintf function (p: TBD)
- 7.21.6.10 The vprintf function (p: TBD)
- 7.21.6.12 The vsnprintf function (p: TBD)
- 7.21.6.13 The vsprintf function (p: TBD)
- K.3.5.3.8 The vfprintf_s function (p: TBD)
- K.3.5.3.10 The vprintf_s function (p: TBD)
- K.3.5.3.12 The vsnprintf_s function (p: TBD)
- K.3.5.3.13 The vsprintf_s function (p: TBD)
- Estándar C17 (ISO/IEC 9899:2018):
- 7.21.6.8 The vfprintf function (p: 238)
- 7.21.6.10 The vprintf function (p: 239)
- 7.21.6.12 The vsnprintf function (p: 239-240)
- 7.21.6.13 The vsprintf function (p: 240)
- K.3.5.3.8 The vfprintf_s function (p: 434)
- K.3.5.3.10 The vprintf_s function (p: 435)
- K.3.5.3.12 The vsnprintf_s function (p: 436-437)
- K.3.5.3.13 The vsprintf_s function (p: 437)
- Estándar C11 (ISO/IEC 9899:2011):
- 7.21.6.8 The vfprintf function (p: 326-327)
- 7.21.6.10 The vprintf function (p: 328)
- 7.21.6.12 The vsnprintf function (p: 329)
- 7.21.6.13 The vsprintf function (p: 329)
- K.3.5.3.8 The vfprintf_s function (p: 597)
- K.3.5.3.10 The vprintf_s function (p: 598-599)
- K.3.5.3.12 The vsnprintf_s function (p: 600)
- K.3.5.3.13 The vsprintf_s function (p: 601)
- Estándar C99 (ISO/IEC 9899:1999):
- 7.19.6.8 The vfprintf function (p: 292)
- 7.19.6.10 The vprintf function (p: 293)
- 7.19.6.12 The vsnprintf function (p: 294)
- 7.19.6.13 The vsprintf function (p: 295)
- Estándar C89/C90 (ISO/IEC 9899:1990):
- 4.9.6.7 The vfprintf function
- 4.9.6.8 The vprintf function
- 4.9.6.9 The vsprintf function
Véase también
(C95)(C95)(C95)(C11)(C11)(C11)(C11) |
imprime salida de caracteres anchos formateada a stdout, un flujo de archivo o un búfer usando lista de argumentos variable (función) |
(C99)(C11)(C11)(C11)(C11) |
imprime salida formateada a stdout, un flujo de archivo o un búfer (función) |
(C99)(C99)(C99)(C11)(C11)(C11) |
lee entrada formateada desde stdin, un flujo de archivo o un búfer usando lista de argumentos variable (función) |
Documentación de C++ para vprintf, vfprintf, vsprintf y vsnprintf
| |