printf_s, _printf_s_l, wprintf_s, _wprintf_s_l

Stampa output formattato nel flusso di output standard. Queste versioni di printf, _printf_lwprintf, , _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_errliste _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, stdoute stderrdevono 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, stdoute stderrdevono 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