Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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