scanf_s
, _scanf_s_l
, wscanf_s
, _wscanf_s_l
Standart giriş akışından biçimlendirilmiş verileri okur. Bu , _scanf_l
, , _wscanf_l
wscanf
sü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 EINVAL
ayarlayınerrno
.
Bunlar ve diğer hata kodları hakkında bilgi için bkz. errno
, _doserrno
, _sys_errlist
ve _sys_nerr
.
Açıklamalar
işlevi standart scanf_s
giriş akışındaki stdin
verileri okur ve içine argument
yazar. Her argument
birinin içindeki tür tanımlayıcısına format
karşı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_s
geniş 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
, S
veya 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 , stdout
ve stderr
işlevlerinin stdin
yeniden 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