Aracılığıyla paylaş


printf_s, _printf_s_l, wprintf_s, _wprintf_s_l

Biçimlendirilmiş çıkışı standart çıkış akışına yazdırır. Bu , _printf_l, , _wprintf_lwprintfsürümlerininprintf, CRT'deki Güvenlik özellikleri bölümünde açıklandığı gibi güvenlik geliştirmeleri vardır.

Sözdizimi

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]...
);

Parametreler

format
Biçim denetimi.

argument
İsteğe bağlı bağımsız değişkenler.

locale
Kullanılacak yerel ayar.

Dönüş değeri

Yazdırılan karakter sayısını veya hata oluşursa negatif bir değer döndürür.

Açıklamalar

İşlev, printf_s bir dizi karakteri ve değeri standart çıkış akışı stdoutolan 'a biçimlendirip yazdırır. Bağımsız değişkenler dizeyi format izlerse, dize bağımsız format değişkenlerin çıkış biçimini belirleyen belirtimler içermelidir.

ile printf arasındaki printf_s temel fark, printf_s biçim dizesini geçerli biçimlendirme karakterleri için denetlerkenprintf, yalnızca biçim dizesinin null işaretçi olup olmadığını denetler. Denetimlerden biri başarısız olursa, Parametre doğrulama bölümünde açıklandığı gibi geçersiz bir parametre işleyicisi çağrılır. Yürütmenin devam etmesi için izin verilirse, işlevi -1 döndürür ve olarak EINVALayarlanırerrno.

ve hata kodları hakkında errno bilgi için bkz.errno , _doserrno, _sys_errlistve _sys_nerr.

printf_s ve fprintf_s aynı şekilde davranır, ancak çıkış printf_sstdout türüne FILEdeğil hedefine yazar. Daha fazla bilgi için bkz. fprintf_s, _fprintf_s_l, fwprintf_s, _fwprintf_s_l.

wprintf_s, öğesinin printf_sformat geniş karakterli bir sürümüdür; geniş karakterli bir dizedir. wprintf_s ve printf_s akış ANSI modunda açıldığında aynı şekilde davranır. printf_s şu anda UNICODE akışına çıkışı desteklemez.

Bu işlevlerin sonekli _l sürümleri aynıdır, ancak geçerli iş parçacığı yerel ayarı yerine geçirilen yerel ayar parametresini kullanırlar.

Genel metin yordamı eşlemeleri

TCHAR.H Rutin _UNICODE ve _MBCS tanımlanmadı _MBCS Tanımlanan _UNICODE Tanımlanan
_tprintf_s printf_s printf_s wprintf_s
_tprintf_s_l _printf_s_l _printf_s_l _wprintf_s_l

Bağımsız format değişken sıradan karakterler, kaçış dizileri ve (bağımsız değişkenler izleniyorsa format) biçim belirtimlerinden oluşur. Normal karakterler ve kaçış dizileri, görünüm sırasına stdout göre kopyalanır. Örneğin, satır

printf_s("Line one\n\t\tLine two\n");

çıktıyı üretir

Line one
        Line two

Biçim belirtimleri her zaman yüzde işaretiyle (%) başlar ve soldan sağa okunur. printf_s İlk biçim belirtimi (varsa) ile karşılaştığında, sonraki ilk bağımsız değişkenin format değerini dönüştürür ve buna göre çıkışını verir. İkinci biçim belirtimi, ikinci bağımsız değişkenin dönüştürülmesine ve çıkışına neden olur, vb. Biçim belirtimlerinden daha fazla bağımsız değişken varsa, ek bağımsız değişkenler yoksayılır. Tüm biçim belirtimleri için yeterli bağımsız değişken yoksa sonuçlar tanımlanmamıştır.

Önemli

format Kullanıcı tanımlı bir dize olmadığından emin olun.

Windows 10 sürüm 2004 'den (derleme 19041) printf başlayarak, işlev ailesi yuvarlama için IEEE 754 kurallarına göre tam olarak temsil edilebilir kayan nokta numaraları yazdırır. Windows'un önceki sürümlerinde, '5' ile biten tam olarak temsil edilebilir kayan nokta sayıları her zaman yukarı yuvarlanırdı. IEEE 754, en yakın çift rakama ("Bankacı Yuvarlama" olarak da bilinir) yuvarlamaları gerektiğini belirtir. Örneğin, hem hem de printf("%1.0f", 1.5)printf("%1.0f", 2.5) 2'ye yuvarlanmalıdır. Daha önce 1,5 2'ye, 2,5 ise 3'e yuvarlardı. Bu değişiklik yalnızca tam olarak temsil edilebilir sayıları etkiler. Örneğin, 2,35 (bellekte temsil edildiğinde 2,3500000000000000000008'e daha yakındır) 2,4'e kadar yuvarlanmaya devam eder. Bu işlevler tarafından yapılan yuvarlama artık tarafından fesetroundayarlanan kayan nokta yuvarlama moduna da dikkat eder. Daha önce yuvarlama her zaman davranışı seçmişti FE_TONEAREST . Bu değişiklik yalnızca Visual Studio 2019 sürüm 16.2 ve üzeri kullanılarak oluşturulan programları etkiler. Eski kayan nokta yuvarlama davranışını kullanmak için ile legacy_stdio_float_rounding.objbağlayın.

Gereksinimler

Yordam Gerekli başlık
printf_s, _printf_s_l <stdio.h>
wprintf_s, _wprintf_s_l <stdio.h> veya <wchar.h>

Konsol Evrensel Windows Platformu (UWP) uygulamalarında desteklenmez. C çalışma zamanı işlevlerinin UWP uygulamalarında kullanabilmesi için önce konsolu stdin, , stdoutve stderrile ilişkilendirilmiş standart akış tanıtıcılarının yeniden yönlendirilmesi gerekir. Daha fazla uyumluluk bilgisi için bkz . Uyumluluk.

Konsol Evrensel Windows Platformu (UWP) uygulamalarında desteklenmez. C çalışma zamanı işlevlerinin UWP uygulamalarında kullanabilmesi için önce konsolu stdin, , stdoutve stderrile ilişkilendirilmiş standart akış tanıtıcılarının yeniden yönlendirilmesi gerekir. Daha fazla uyumluluk bilgisi için bkz . Uyumluluk.

Örnek

// 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);

}

Örnek çıktı

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

Ayrıca bkz.

Matematik ve kayan nokta desteği
Akış G/Ç
Yerel ayar
fopen, _wfopen
fprintf, _fprintf_l, fwprintf, _fwprintf_l
scanf, _scanf_l, wscanf, _wscanf_l
sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l
vprintf işlevleri