vwprintf, vfwprintf, vswprintf, vwprintf_s, vfwprintf_s, vswprintf_s, vsnwprintf_s
| Definido en el encabezado <wchar.h>
|
||
int vwprintf( const wchar_t* format, va_list vlist );
|
(1) | (desde C95) (hasta C99) |
int vwprintf( const wchar_t* restrict format, va_list vlist );
|
(desde C99) | |
int vfwprintf( FILE* stream, const wchar_t* format, va_list vlist );
|
(2) | (desde C95) (hasta C99) |
int vfwprintf( FILE* restrict stream,
const wchar_t* restrict format, va_list vlist );
|
(desde C99) | |
int vswprintf( wchar_t* buffer, size_t bufsz,
const wchar_t* format, va_list vlist );
|
(3) | (desde C95) (hasta C99) |
int vswprintf( wchar_t* restrict buffer, size_t bufsz,
const wchar_t* restrict format, va_list vlist );
|
(desde C99) | |
int vwprintf_s( const wchar_t* restrict format, va_list vlist);
|
(4) | (desde C11) |
int vfwprintf_s( FILE* restrict stream,
const wchar_t* restrict format, va_list vlist);
|
(5) | (desde C11) |
int vswprintf_s( wchar_t* restrict buffer, rsize_t bufsz,
const wchar_t* restrict format, va_list vlist);
|
(6) | (desde C11) |
int vsnwprintf_s( wchar_t* restrict buffer, rsize_t bufsz,
const wchar_t* restrict format, va_list vlist);
|
(7) | (desde C11) |
Carga los datos desde las ubicaciones, definidas por vlist, los convierte en equivalentes de cadena ancha y escribe los resultados en una variedad de destinos.
stream.buffer. Como máximo bufsz - 1 caracteres anchos son escritos seguidos por el carácter nulo ancho. La cadena de caracteres anchos resultante terminará con un carácter nulo ancho, a menos que bufsz sea cero.- el especificador de conversión
%nestá presente enformat - cualquier argumento correspondiente a
%ses un puntero nulo formatobufferes un puntero nulobufszes cero o mayor queRSIZE_MAX / sizeof(wchar_t)- ocurren errores de codificación en cualquier especificador de conversión de cadena y carácter
- (para
vswprintf_ssolamente), la cadena a almacenar enbuffer(incluyendo el nulo ancho final) excederíabufsz.
buffer.vwprintf_s, vfwprintf_s, vswprintf_s y vsnwprintf_s solo están garantizadas de estar 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 ancho de salida al que escribir |
| buffer | - | puntero a una cadena ancha donde escribir |
| bufsz | - | número máximo de caracteres anchos a escribir |
| format | - | puntero a una cadena ancha terminada en nulo que especifica cómo interpretar los datos |
| vlist | - | lista de argumentos variables que contiene los datos a imprimir. |
La cadena format consiste en caracteres anchos 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 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 solo lleva el 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 una forma alternativa de la conversión. 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 punto flotante, se usan ceros a la izquierda para rellenar el campo en lugar de caracteres de espacio. Para números enteros, se ignora si se especifica explícitamente la precisión. Para otras conversiones, el uso de 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 de espacio (por defecto), si es necesario, a la izquierda cuando se justifica a la derecha, o a la derecha si se justifica 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 antes del argumento que proporciona la precisión si se proporciona uno. Si el valor del argumento es negativo, resulta en la bandera-especificada 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 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 proporciona el ancho mínimo de campo si se proporciona 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. Consulte la tabla a continuación para conocer los 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 | Esperado Tipo de argumento | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Modificador de longitud→ | hh | h | ninguno | l | ll | j | z | t | L | |
| Solo disponible desde C99→ | Sí | Sí | Sí | Sí | Sí | |||||
%
|
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.
|
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 en 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 en 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 en representación octal oooo.
|
N/A | ||||||||
xX
|
Convierte un entero sin signo en representación hexadecimal hhhh.
|
N/A | ||||||||
u
|
Convierte un entero sin signo en representación decimal dddd.
|
N/A | ||||||||
fF (C99)
|
Convierte un 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 un 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 un 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 un 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 carácter de ancho fijo (int8_t, etc.) se definen 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
bufsz, la función devuelve el número total de caracteres (sin incluir el carácter nulo ancho de terminación) que se habrían escrito si no se impusiera el límite.buffer, sin contar el carácter nulo ancho (que siempre se escribe siempre que buffer no sea un puntero nulo y bufsz no sea cero ni mayor que RSIZE_MAX/sizeof(wchar_t)), o cero en violaciones de restricciones en tiempo de ejecución, y valor negativo en errores de codificación.buffer no sea un puntero nulo y bufsz no sea cero ni mayor que RSIZE_MAX/sizeof(wchar_t)), que se habrían escrito en buffer si se hubiera ignorado bufsz, o un valor negativo si ocurrió una violación de restricciones en tiempo de ejecución o un error de codificación.Notas
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 hacerlo quien las llama.
Mientras que las cadenas estrechas proporcionan vsnprintf, que permite determinar el tamaño requerido del búfer de salida, no hay un equivalente para cadenas anchas (hasta vsnwprintf_s de C11), y para determinar el tamaño del búfer, el programa puede necesitar llamar a vswprintf, verificar el valor del resultado y reasignar un búfer más grande, intentando de nuevo hasta tener éxito.
vsnwprintf_s, a diferencia de vswprintf_s, truncará el resultado para que quepa dentro del arreglo apuntado por buffer, aunque el truncamiento se trata como un error por la mayoría de las funciones con verificación de límites.
Ejemplo
#include <locale.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <wchar.h>
void debug_wlog(const wchar_t* 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 args;
va_start(args, fmt);
wchar_t buf[1024];
int rc2 = vswprintf(buf, sizeof buf / sizeof *buf, fmt, args);
va_end(args);
if (rc2 > 0)
wprintf(L"%s [debug]: %ls\n", time_buf, buf);
else
wprintf(L"%s [debug]: (string too long)\n", time_buf);
}
int main(void)
{
setlocale(LC_ALL, "");
debug_wlog(L"Logging, %d, %d, %d", 1, 2, 3);
}
Posible salida:
02/20/15 22:12:38.476575 UTC [debug]: Logging, 1, 2, 3
Referencias
- Estándar C23 (ISO/IEC 9899:2024):
- 7.29.2.5 La función vfwprintf (p: TBD)
- 7.29.2.7 La función vswprintf (p: TBD)
- 7.29.2.9 La función vwprintf (p: TBD)
- K.3.9.1.6 La función vfwprintf_s (p: TBD)
- K.3.9.1.8 La función vsnwprintf_s (p: TBD)
- K.3.9.1.9 La función vswprintf_s (p: TBD)
- K.3.9.1.11 La función vwprintf_s (p: TBD)
- Estándar C17 (ISO/IEC 9899:2018):
- 7.29.2.5 La función vfwprintf (p: TBD)
- 7.29.2.7 La función vswprintf (p: TBD)
- 7.29.2.9 La función vwprintf (p: TBD)
- K.3.9.1.6 La función vfwprintf_s (p: TBD)
- K.3.9.1.8 La función vsnwprintf_s (p: TBD)
- K.3.9.1.9 La función vswprintf_s (p: TBD)
- K.3.9.1.11 La función vwprintf_s (p: TBD)
- Estándar C11 (ISO/IEC 9899:2011):
- 7.29.2.5 La función vfwprintf (p: 417-418)
- 7.29.2.7 La función vswprintf (p: 419)
- 7.29.2.9 La función vwprintf (p: 420)
- K.3.9.1.6 La función vfwprintf_s (p: 632)
- K.3.9.1.8 La función vsnwprintf_s (p: 633-634)
- K.3.9.1.9 La función vswprintf_s (p: 634-635)
- K.3.9.1.11 La función vwprintf_s (p: 636)
- Estándar C99 (ISO/IEC 9899:1999):
- 7.24.2.5 La función vfwprintf (p: 363)
- 7.24.2.7 La función vswprintf (p: 364)
- 7.24.2.9 La función vwprintf (p: 365)
Véase también
(C99)(C11)(C11)(C11)(C11) |
imprime salida formateada en stdout, un flujo de archivo o un búfer usando una lista de argumentos variables (función) |
(C95)(C95)(C95)(C11)(C11)(C11)(C11) |
imprime salida formateada de caracteres anchos en stdout, un flujo de archivo o un búfer (función) |
Documentación de C++ para vwprintf, vfwprintf, vswprintf
| |