scanf_s
, , _scanf_s_l
, , wscanf_s
_wscanf_s_l
Odczytuje sformatowane dane ze standardowego strumienia wejściowego. Te wersje programu scanf
, wscanf
_scanf_l
_wscanf_l
, mają ulepszenia zabezpieczeń zgodnie z opisem w temacie Funkcje zabezpieczeń w narzędziu CRT.
Składnia
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]...
);
Parametry
format
Formatuj ciąg sterujący.
argument
Argumenty opcjonalne.
locale
Ustawienia regionalne do użycia.
Wartość zwracana
Zwraca liczbę pól pomyślnie przekonwertowanych i przypisanych. Wartość zwracana nie zawiera pól, które zostały odczytane, ale nie zostały przypisane. Wartość zwracana 0 wskazuje, że nie przypisano pól. Wartość zwracana jest EOF
dla błędu lub jeśli znak końca pliku lub znak końca ciągu zostanie znaleziony podczas pierwszej próby odczytania znaku. Jeśli format
jest wskaźnikiem NULL
, wywoływana jest nieprawidłowa procedura obsługi parametrów, zgodnie z opisem w temacie Weryfikacja parametrów. Jeśli wykonywanie jest dozwolone do kontynuowania, scanf_s
i zwracanie wscanf_s
EOF
i ustawianie wartości errno
.EINVAL
Aby uzyskać informacje o tych i innych kodach błędów, zobacz errno
, _doserrno
, _sys_errlist
i _sys_nerr
.
Uwagi
Funkcja scanf_s
odczytuje dane ze standardowego strumienia wejściowego i stdin
zapisuje je w pliku argument
. Każdy argument
musi być wskaźnikiem typu zmiennej, który odpowiada specyfikatorowi typu w programie format
. Jeśli kopiowanie odbywa się między nakładającymi się ciągami, zachowanie jest niezdefiniowane.
wscanf_s
jest wersją szerokoznakową ; scanf_s
argument to format
wscanf_s
ciąg o szerokim znaku. wscanf_s
i scanf_s
zachowuje się identycznie, jeśli strumień jest otwarty w trybie ANSI. scanf_s
obecnie nie obsługuje danych wejściowych ze strumienia UNICODE.
Wersje tych funkcji, które mają _l
sufiks, są identyczne, z wyjątkiem tego, że używają parametru locale
zamiast bieżących ustawień regionalnych wątku.
W przeciwieństwie do scanf
parametrów i wscanf
scanf_s
i wscanf_s
wymagają określenia rozmiarów buforu dla niektórych parametrów. Określ rozmiary wszystkich c
parametrów zestawu []
kontrolek , , C
s
, S
lub ciągów. Rozmiar buforu w znakach jest przekazywany jako inny parametr. Natychmiast następuje wskaźnik do buforu lub zmiennej. Jeśli na przykład odczytujesz ciąg, rozmiar buforu dla tego ciągu jest przekazywany w następujący sposób:
char s[10];
scanf_s("%9s", s, (unsigned)_countof(s)); // buffer size is 10, width specification is 9
Rozmiar buforu zawiera wartość null terminalu. Możesz użyć pola specyfikacji szerokości, aby upewnić się, że token, który jest odczytywany w buforze, pasuje do buforu. Jeśli token jest zbyt duży, aby zmieścić się, nic nie jest zapisywane w buforze, chyba że istnieje specyfikacja szerokości.
Uwaga
Parametr rozmiaru jest typu unsigned
, a nie size_t
. Użyj rzutowania size_t
statycznego, aby przekonwertować wartość na unsigned
dla konfiguracji kompilacji 64-bitowej.
Parametr rozmiaru buforu opisuje maksymalną liczbę znaków, a nie bajtów. W tym przykładzie szerokość typu buforu nie jest zgodna z szerokością specyfikatora formatu.
wchar_t ws[10];
wscanf_s(L"%9S", ws, (unsigned)_countof(ws));
Specyfikator S
formatu oznacza użycie szerokości znaku , która jest "przeciwna" domyślnej szerokości obsługiwanej przez funkcję. Szerokość znaku jest pojedynczym bajtem, ale funkcja obsługuje znaki dwubajtowe. Ten przykład odczytuje ciąg o długości do dziewięciu znaków o długości jednego bajtu i umieszcza je w buforze znaków dwubajtowych. Znaki są traktowane jako wartości jedno bajtowe; pierwsze dwa znaki są przechowywane w ws[0]
pliku , drugie dwa są przechowywane w ws[1]
pliku i tak dalej.
W tym przykładzie odczytuje jeden znak:
char c;
scanf_s("%c", &c, 1);
Gdy odczytywane są wiele znaków dla ciągów bez wartości null, liczby całkowite są używane zarówno dla specyfikacji szerokości, jak i rozmiaru buforu.
char c[4];
scanf_s("%4c", c, (unsigned)_countof(c)); // not null terminated
Aby uzyskać więcej informacji, zobacz scanf
Specyfikacja szerokości.
Mapowania procedur tekstu ogólnego
TCHAR.H rutyna |
_UNICODE i _MBCS niezdefiniowane |
_MBCS zdefiniowany |
_UNICODE zdefiniowany |
---|---|---|---|
_tscanf_s |
scanf_s |
scanf_s |
wscanf_s |
_tscanf_s_l |
_scanf_s_l |
_scanf_s_l |
_wscanf_s_l |
Aby uzyskać więcej informacji, zobacz Pola specyfikacji formatu: scanf
i wscanf
funkcje.
Wymagania
Procedura | Wymagany nagłówek |
---|---|
scanf_s , _scanf_s_l |
<stdio.h> |
wscanf_s , _wscanf_s_l |
<stdio.h> lub <wchar.h> |
Konsola nie jest obsługiwana w aplikacjach platformy platforma uniwersalna systemu Windows (UWP). Standardowy strumień obsługuje stdin
, stdout
i stderr
musi być przekierowywany, zanim funkcje czasu wykonywania języka C mogą używać ich w aplikacjach platformy UWP. Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.
Przykład
// 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);
}
Ten program generuje następujące dane wyjściowe w przypadku danych wejściowych:
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
Zobacz też
Obsługa obliczeń matematycznych i zmiennoprzecinkowych
We/Wy strumienia
ustawienia regionalne
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