scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l

Standart giriş akışından biçimlendirilmiş verileri okur. Bu , _scanf_l, , _wscanf_l wscanfsürümlerininscanf, CRT'deki Güvenlik özellikleri bölümünde açıklandığı gibi güvenlik geliştirmeleri vardır.

Sözdizimi

int scanf_s(
   const char *format [,
   argument]...
);
int _scanf_s_l(
   const char *format,
   _locale_t locale [,
   argument]...
);
int wscanf_s(
   const wchar_t *format [,
   argument]...
);
int _wscanf_s_l(
   const wchar_t *format,
   _locale_t locale [,
   argument]...
);

Parametreler

format
Denetim dizesini biçimlendir.

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

locale
Kullanılacak yerel ayar.

Dönüş değeri

Başarıyla dönüştürülen ve atanan alanların sayısını döndürür. Dönüş değeri okunmuş ancak atanmamış alanları içermez. 0 dönüş değeri, hiçbir alanın atanmadığını gösterir. Dönüş değeri bir hataya yöneliktir EOF veya ilk karakter okuma denemesinde dosya sonu karakteri veya dize sonu karakteri bulunursa. bir işaretçiyseformat, parametre doğrulama bölümünde açıklandığı gibi geçersiz parametre işleyicisi çağrılır.NULL Yürütmenin devam etmesi için izin verilirse, scanf_s wscanf_s döndürerek EOF olarak EINVALayarlayınerrno.

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

Açıklamalar

işlevi standart scanf_s giriş akışındaki stdinverileri okur ve içine argumentyazar. Her argument birinin içindeki tür tanımlayıcısına formatkarşılık gelen değişken türüne yönelik bir işaretçi olması gerekir. Çakışan dizeler arasında kopyalama olursa davranış tanımsızdır.

wscanf_s , öğesinin scanf_sgeniş karakterli bir sürümüdür; format bağımsız değişkeni wscanf_s geniş karakterli bir dizedir. wscanf_s ve scanf_s akış ANSI modunda açıldığında aynı şekilde davranır. scanf_s şu anda bir UNICODE akışından girişi desteklemez.

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

ve wscanf'in scanf_s aksine scanf ve wscanf_s bazı parametreler için arabellek boyutları belirtmenizi gerektirir. Tüm c, , C, s, Sveya dize denetim kümesi [] parametrelerinin boyutlarını belirtin. Karakterlerdeki arabellek boyutu başka bir parametre olarak geçirilir. İşaretçiyi arabelleğe veya değişkene kadar hemen izler. Örneğin, bir dize okuyorsanız, bu dizenin arabellek boyutu aşağıdaki gibi geçirilir:

char s[10];
scanf_s("%9s", s, (unsigned)_countof(s)); // buffer size is 10, width specification is 9

Arabellek boyutu null terminalini içerir. Içinde okunan belirtecin arabelleğe sığdığından emin olmak için bir genişlik belirtimi alanı kullanabilirsiniz. Bir belirtecin sığamayacak kadar büyük olması, genişlik belirtimi olmadığı sürece arabelleğe hiçbir şey yazılmıyor.

Not

Boyut parametresi türündedir unsigned, türünde değildir size_t. Bir değeri unsigned 64 bit derleme yapılandırmalarına dönüştürmek size_t için statik bir atama kullanın.

Arabellek boyutu parametresi bayt değil en fazla karakter sayısını açıklar. Bu örnekte, arabellek türünün genişliği biçim tanımlayıcısının genişliğiyle eşleşmiyor.

wchar_t ws[10];
wscanf_s(L"%9S", ws, (unsigned)_countof(ws));

Biçim belirtici, S işlevin desteklediği varsayılan genişliğin "tersi" olan karakter genişliğinin kullanılması anlamına gelir. Karakter genişliği tek bayttır, ancak işlev çift baytlı karakterleri destekler. Bu örnek, en fazla dokuz tek baytlık karakterden oluşan bir dizede okur ve bunları çift bayt genişliğinde bir karakter arabelleğine yerleştirir. Karakterler tek baytlık değer olarak kabul edilir; ilk iki karakter ws[0] içinde depolanır, ikinci iki karakter ws[1] içinde depolanır ve bu şekilde devam eder.

Bu örnekte tek bir karakter okunur:

char c;
scanf_s("%c", &c, 1);

Null olmayan sonlandırılan dizeler için birden çok karakter okunduğunda, hem genişlik belirtimi hem de arabellek boyutu için tamsayılar kullanılır.

char c[4];
scanf_s("%4c", c, (unsigned)_countof(c)); // not null terminated

Daha fazla bilgi için bkz scanf . Genişlik Belirtimi.

Genel metin yordamı eşlemeleri

TCHAR.H olağan _UNICODE ve _MBCS tanımlanmadı _MBCS tanımlanan _UNICODE tanımlanan
_tscanf_s scanf_s scanf_s wscanf_s
_tscanf_s_l _scanf_s_l _scanf_s_l _wscanf_s_l

Daha fazla bilgi için bkz . Belirtim alanlarını biçimlendirme: scanf ve wscanf işlevleri.

Gereksinimler

Yordam Gerekli başlık
scanf_s, _scanf_s_l <stdio.h>
wscanf_s, _wscanf_s_l <stdio.h> veya <wchar.h>

Konsol Evrensel Windows Platformu (UWP) uygulamalarında desteklenmez. Standart akış, C çalışma zamanı işlevlerinin bunları UWP uygulamalarında kullanabilmesi için önce , stdoutve stderr işlevlerinin stdinyeniden yönlendirilmesi gerekir. Daha fazla uyumluluk bilgisi için bkz . Uyumluluk.

Örnek

// crt_scanf_s.c
// This program uses the scanf_s and wscanf_s functions
// to read formatted input.

#include <stdio.h>
#include <stdlib.h>

int main( void )
{
   int      i,
            result;
   float    fp;
   char     c,
            s[80];
   wchar_t  wc,
            ws[80];

   result = scanf_s( "%d %f %c %C %s %S", &i, &fp, &c, 1,
                     &wc, 1, s, (unsigned)_countof(s), ws, (unsigned)_countof(ws) );
   printf( "The number of fields input is %d\n", result );
   printf( "The contents are: %d %f %c %C %s %S\n", i, fp, c,
           wc, s, ws);
   result = wscanf_s( L"%d %f %hc %lc %S %ls", &i, &fp, &c, 2,
                      &wc, 1, s, (unsigned)_countof(s), ws, (unsigned)_countof(ws) );
   wprintf( L"The number of fields input is %d\n", result );
   wprintf( L"The contents are: %d %f %C %c %hs %s\n", i, fp,
            c, wc, s, ws);
}

Bu program, bu girdi verildiğinde aşağıdaki çıktıyı oluşturur:

71 98.6 h z Byte characters
36 92.3 y n Wide characters
The number of fields input is 6
The contents are: 71 98.599998 h z Byte characters
The number of fields input is 6
The contents are: 36 92.300003 y n Wide characters

Ayrıca bkz.

Matematik ve kayan nokta desteği
Akış G/Ç
Yerel ayar
fscanf, _fscanf_l, fwscanf, _fwscanf_l
printf, _printf_l, wprintf, _wprintf_l
sprintf, _sprintf_l, swprintf, _swprintf_l, , __swprintf_l
sscanf, _sscanf_l, swscanf, _swscanf_l