vwprintf, vfwprintf, vswprintf, vwprintf_s, vfwprintf_s, vswprintf_s, vsnwprintf_s
|
Definido en el encabezado
<wchar.h>
|
||
| (1) | ||
|
int
vwprintf
(
const
wchar_t
*
format, va_list vlist
)
;
|
(desde C95)
(hasta C99) |
|
|
int
vwprintf
(
const
wchar_t
*
restrict
format, va_list vlist
)
;
|
(desde C99) | |
| (2) | ||
|
int
vfwprintf
(
FILE
*
stream,
const
wchar_t
*
format, va_list vlist
)
;
|
(desde C95)
(hasta C99) |
|
|
int
vfwprintf
(
FILE
*
restrict
stream,
const wchar_t * restrict format, va_list vlist ) ; |
(desde C99) | |
| (3) | ||
|
int
vswprintf
(
wchar_t
*
buffer,
size_t
bufsz,
const wchar_t * format, va_list vlist ) ; |
(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 ubicaciones, definidas por vlist , los convierte a equivalentes de cadena ancha y escribe los resultados a una variedad de destinos.
-
-
el especificador de conversión
%nestá presente en format -
cualquiera de los argumentos correspondientes a
%ses un puntero nulo - format o buffer es un puntero nulo
- bufsz es cero o mayor que RSIZE_MAX / sizeof ( wchar_t )
- ocurren errores de codificación en cualquiera de los especificadores de conversión de cadena y carácter
-
(solo para
vswprintf_s), la cadena a almacenar en buffer (incluyendo el carácter nulo ancho final) excedería bufsz .
-
el especificador de conversión
-
Como con todas las funciones con verificación de límites,
vwprintf_s,vfwprintf_s,vswprintf_s, yvsnwprintf_ssolo 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> .
Contenidos |
Parámetros
| stream | - | flujo de salida ancho al que escribir |
| buffer | - | puntero a una cadena ancha a la que 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 de
formato
consiste en caracteres anchos 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 está justificado a la derecha). -
+: el signo de las conversiones con signo siempre se antepone al resultado de la conversión (por defecto el resultado va precedido por el signo menos solo cuando es negativo). -
space
: 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 en que se utilice*, el ancho se especifica mediante un argumento adicional de tipo int , que aparece antes del argumento a convertir y del argumento que proporciona la precisión si se suministra uno. Si el valor del argumento es negativo, resulta con el indicador-especificado 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 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 de 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 C99→ | 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
|
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
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
(C99)
|
Convierte números de punto flotante a 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
|
e
E
|
Convierte números de punto flotante a la notación exponencial decimal.
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
a
A
(C99) |
Convierte números de punto flotante a 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
*
|
intmax_t
*
|
※
|
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 (
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 es inválida, el comportamiento es indefinido. |
||||||||||
Valor de retorno
RSIZE_MAX/sizeof(wchar_t)
), o cero en caso de violaciones de restricciones en tiempo de ejecución, y valor negativo en errores de codificación.
RSIZE_MAX/sizeof(wchar_t)
), que habría sido escrito en
buffer
si
bufsz
fuera ignorado, 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 ser realizado por el llamador.
Mientras que las cadenas estrechas proporcionan
vsnprintf
, lo que hace posible determinar el tamaño requerido del búfer de salida, no existe 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 resultante y reasignar un búfer más grande, intentando nuevamente hasta tener éxito.
vsnwprintf_s
, a diferencia de
vswprintf_s
, truncará el resultado para ajustarse dentro del array apuntado por
buffer
, aunque el truncamiento sea tratado 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); }
Salida posible:
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 a
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 a
stdout
, un flujo de archivo o un búfer
(función) |
|
Documentación de C++
para
vwprintf
,
vfwprintf
,
vswprintf
|
|