printf_s
, _printf_s_l
, wprintf_s
, _wprintf_s_l
Stampa output formattato nel flusso di output standard. Queste versioni di printf
, _printf_l
wprintf
, , _wprintf_l
includono miglioramenti della sicurezza, come descritto in Funzionalità di sicurezza in CRT.
Sintassi
int printf_s(
const char *format [,
argument]...
);
int _printf_s_l(
const char *format,
_locale_t locale [,
argument]...
);
int wprintf_s(
const wchar_t *format [,
argument]...
);
int _wprintf_s_l(
const wchar_t *format,
_locale_t locale [,
argument]...
);
Parametri
format
Controllo del formato.
argument
Argomenti facoltativi.
locale
Impostazioni locali da usare.
Valore restituito
Restituisce il numero di caratteri stampati o un valore negativo se si verifica un errore.
Osservazioni:
La funzione printf_s
formatta e stampa una serie di caratteri e di valori nel flusso di output standard, stdout
. Se la stringa format
è seguita da argomenti, la stringa format
deve contenere le specifiche che determinano il formato di output per gli argomenti.
La differenza principale tra printf_s
e printf
è che printf_s
controlla la stringa di formato per i caratteri di formattazione validi, mentre printf
controlla solo se la stringa di formato è un puntatore Null. Se uno dei controlli ha esito negativo, viene richiamato un gestore di parametri non validi, come descritto in Convalida dei parametri. Se l'esecuzione può continuare, la funzione restituisce -1 e imposta errno
su EINVAL
.
Per informazioni sui errno
codici di errore e , vedere errno
, _doserrno
, _sys_errlist
e _sys_nerr
.
printf_s
e fprintf_s
si comportano in modo identico, ad eccezione del fatto che printf_s
scrive l'output in stdout
anziché in una destinazione di tipo FILE
. Per altre informazioni, vedere fprintf_s
, _fprintf_s_l
, fwprintf_s
, _fwprintf_s_l
.
wprintf_s
è una versione a caratteri wide di printf_s
. format
è una stringa di caratteri wide. wprintf_s
e printf_s
si comportano in modo analogo, se il flusso viene aperto in modalità ANSI. printf_s
non supporta attualmente l'output in un flusso UNICODE.
Le versioni di queste funzioni con il suffisso _l
sono identiche ad eccezione per il fatto che utilizzano il parametro delle impostazioni locali passato al posto di quelle del thread corrente.
Mapping di routine di testo generico
TCHAR.H Routine |
_UNICODE e _MBCS non definito |
_MBCS Definito |
_UNICODE Definito |
---|---|---|---|
_tprintf_s |
printf_s |
printf_s |
wprintf_s |
_tprintf_s_l |
_printf_s_l |
_printf_s_l |
_wprintf_s_l |
L'argomento format
è costituito da caratteri ordinari, sequenze di escape, e specifiche di formato (in presenza di argomenti dopo format
). I caratteri ordinari e le sequenze di escape vengono copiati in stdout
in ordine di visualizzazione. Ad esempio, la riga di comando
printf_s("Line one\n\t\tLine two\n");
produce l'output
Line one
Line two
Le specifiche di formato iniziano sempre con un segno di percentuale (%
) e vengono lette da sinistra a destra. Quando printf_s
rileva la prima specifica di formato (se presente), converte il valore del primo argomento dopo format
e lo restituisce. La seconda specifica di formato fa sì che venga convertito e restituito il secondo argomento e così via. Se sono presenti più argomenti che specifiche di formato, gli argomenti aggiuntivi vengono ignorati. I risultati non sono definiti se non sono presenti argomenti sufficienti per tutte le specifiche di formato.
Importante
Assicurarsi che format
non sia una stringa definita dall'utente.
A partire da Windows 10 versione 2004 (build 19041), la printf
famiglia di funzioni stampa esattamente numeri a virgola mobile rappresentabili in base alle regole I edizione Enterprise E 754 per l'arrotondamento. Nelle versioni precedenti di Windows, i numeri a virgola mobile che terminano in '5' verrebbero sempre arrotondati. I edizione Enterprise E 754 indica che devono arrotondare alla cifra pari più vicina (nota anche come "Arrotondamento del banchiere"). Ad esempio, sia printf("%1.0f", 1.5)
che printf("%1.0f", 2.5)
devono essere arrotondati a 2. In precedenza, 1,5 arrotonderebbe a 2 e 2,5 arrotonderebbe a 3. Questa modifica influisce solo sui numeri rappresentabili esattamente. Ad esempio, 2.35 (che, se rappresentato in memoria, è più vicino a 2,350000000000000008) continua a arrotondare fino a 2,4. L'arrotondamento eseguito da queste funzioni ora rispetta anche la modalità di arrotondamento a virgola mobile impostata da fesetround
. In precedenza, l'arrotondamento ha sempre scelto FE_TONEAREST
il comportamento. Questa modifica interessa solo i programmi compilati con Visual Studio 2019 versione 16.2 e successive. Per usare il comportamento di arrotondamento a virgola mobile legacy, collegarsi a legacy_stdio_float_rounding.obj
.
Requisiti
Ciclo | Intestazione obbligatoria |
---|---|
printf_s , _printf_s_l |
<stdio.h> |
wprintf_s , _wprintf_s_l |
<stdio.h> oppure <wchar.h> |
La console non è supportata nelle app piattaforma UWP (Universal Windows Platform) (UWP). Gli handle di flusso standard associati alla console, stdin
, stdout
e stderr
devono essere reindirizzati prima che le funzioni di runtime C possano usarle nelle app UWP. Per altre informazioni sulla compatibilità, vedere Compatibility (Compatibilità).
La console non è supportata nelle app piattaforma UWP (Universal Windows Platform) (UWP). Gli handle di flusso standard associati alla console, stdin
, stdout
e stderr
devono essere reindirizzati prima che le funzioni di runtime C possano usarle nelle app UWP. Per altre informazioni sulla compatibilità, vedere Compatibility (Compatibilità).
Esempio
// crt_printf_s.c
/* This program uses the printf_s and wprintf_s functions
* to produce formatted output.
*/
#include <stdio.h>
int main( void )
{
char ch = 'h', *string = "computer";
int count = -9234;
double fp = 251.7366;
wchar_t wch = L'w', *wstring = L"Unicode";
/* Display integers. */
printf_s( "Integer formats:\n"
" Decimal: %d Justified: %.6d Unsigned: %u\n",
count, count, count );
printf_s( "Decimal %d as:\n Hex: %Xh C hex: 0x%x Octal: %o\n",
count, count, count, count );
/* Display in different radixes. */
printf_s( "Digits 10 equal:\n Hex: %i Octal: %i Decimal: %i\n",
0x10, 010, 10 );
/* Display characters. */
printf_s("Characters in field (1):\n%10c%5hc%5C%5lc\n", ch, ch, wch, wch);
wprintf_s(L"Characters in field (2):\n%10C%5hc%5c%5lc\n", ch, ch, wch, wch);
/* Display strings. */
printf_s("Strings in field (1):\n%25s\n%25.4hs\n %S%25.3ls\n",
string, string, wstring, wstring);
wprintf_s(L"Strings in field (2):\n%25S\n%25.4hs\n %s%25.3ls\n",
string, string, wstring, wstring);
/* Display real numbers. */
printf_s( "Real numbers:\n %f %.2f %e %E\n", fp, fp, fp, fp );
/* Display pointer. */
printf_s( "\nAddress as: %p\n", &count);
}
Output di esempio
Integer formats:
Decimal: -9234 Justified: -009234 Unsigned: 4294958062
Decimal -9234 as:
Hex: FFFFDBEEh C hex: 0xffffdbee Octal: 37777755756
Digits 10 equal:
Hex: 16 Octal: 8 Decimal: 10
Characters in field (1):
h h w w
Characters in field (2):
h h w w
Strings in field (1):
computer
comp
Unicode Uni
Strings in field (2):
computer
comp
Unicode Uni
Real numbers:
251.736600 251.74 2.517366e+002 2.517366E+002
Address as: 0012FF78
Vedi anche
Supporto matematico e a virgola mobile
I/O di flusso
impostazioni locali
fopen
, _wfopen
fprintf
, _fprintf_l
, fwprintf
, _fwprintf_l
scanf
, _scanf_l
, wscanf
, _wscanf_l
sprintf
, _sprintf_l
, swprintf
, _swprintf_l
, __swprintf_l
Funzioni vprintf
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per