scanf_s
, , _scanf_s_l
wscanf_s
,_wscanf_s_l
Membaca data yang diformat dari aliran input standar. Versi , , , wscanf
_wscanf_l
ini memiliki peningkatan keamanan, seperti yang dijelaskan dalam Fitur keamanan di CRT. _scanf_l
scanf
Sintaks
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]...
);
Parameter
format
Format string kontrol.
argument
Argumen opsional.
locale
Lokal yang akan digunakan.
Nilai hasil
Mengembalikan jumlah bidang yang berhasil dikonversi dan ditetapkan. Nilai yang dikembalikan tidak menyertakan bidang yang dibaca tetapi tidak ditetapkan. Nilai pengembalian 0 menunjukkan tidak ada bidang yang ditetapkan. Nilai yang dikembalikan adalah EOF
untuk kesalahan, atau jika karakter akhir file atau karakter akhir string ditemukan dalam upaya pertama untuk membaca karakter. Jika format
adalah NULL
penunjuk, handler parameter yang tidak valid dipanggil, seperti yang dijelaskan dalam Validasi parameter. Jika eksekusi diizinkan untuk melanjutkan, scanf_s
dan wscanf_s
mengembalikan EOF
dan mengatur errno
ke EINVAL
.
Untuk informasi tentang kode kesalahan ini dan lainnya, lihat errno
, , _doserrno
_sys_errlist
, dan _sys_nerr
.
Keterangan
Fungsi ini scanf_s
membaca data dari aliran input standar, stdin
, dan menulisnya ke dalam argument
. Masing-masing argument
harus menjadi penunjuk ke jenis variabel yang sesuai dengan penentu jenis di format
. Jika penyalinan terjadi di antara string yang tumpang tindih, perilaku tidak terdefinisi.
wscanf_s
adalah versi karakter luas dari scanf_s
; format
argumen ke wscanf_s
adalah string karakter lebar. wscanf_s
dan scanf_s
bersifat identik jika aliran dibuka dalam mode ANSI. scanf_s
saat ini tidak mendukung input dari aliran UNICODE.
Versi fungsi-fungsi ini yang memiliki _l
akhiran identik, kecuali mereka menggunakan locale
parameter alih-alih lokal utas saat ini.
Tidak seperti scanf
dan wscanf
, scanf_s
dan wscanf_s
mengharuskan Anda menentukan ukuran buffer untuk beberapa parameter. Tentukan ukuran untuk semua c
parameter set []
kontrol string , C
, s
, S
atau . Ukuran buffer dalam karakter diteruskan sebagai parameter lain. Ini segera mengikuti penunjuk ke buffer atau variabel. Misalnya, jika Anda membaca string, ukuran buffer untuk string tersebut diteruskan sebagai berikut:
char s[10];
scanf_s("%9s", s, (unsigned)_countof(s)); // buffer size is 10, width specification is 9
Ukuran buffer mencakup terminal null. Anda dapat menggunakan bidang spesifikasi lebar untuk memastikan token yang dibaca sesuai dengan buffer. Ketika token terlalu besar agar pas, tidak ada yang ditulis ke buffer kecuali ada spesifikasi lebar.
Catatan
Parameter ukuran berjenis unsigned
, bukan size_t
. Gunakan cast statis untuk mengonversi size_t
nilai ke unsigned
untuk konfigurasi build 64-bit.
Parameter ukuran buffer menjelaskan jumlah maksimum karakter, bukan byte. Dalam contoh ini, lebar jenis buffer tidak cocok dengan lebar penentu format.
wchar_t ws[10];
wscanf_s(L"%9S", ws, (unsigned)_countof(ws));
Penentu S
format berarti gunakan lebar karakter yang "berlawanan" lebar default yang didukung oleh fungsi. Lebar karakter adalah byte tunggal, tetapi fungsi mendukung karakter byte ganda. Contoh ini membaca dalam string hingga sembilan karakter lebar byte tunggal dan menempatkannya dalam buffer karakter di seluruh byte ganda. Karakter diperlakukan sebagai nilai byte tunggal; dua karakter pertama disimpan di ws[0]
, dua karakter kedua disimpan di ws[1]
, dan sebagainya.
Contoh ini membaca satu karakter:
char c;
scanf_s("%c", &c, 1);
Ketika beberapa karakter untuk string yang tidak dihentikan null dibaca, bilangan bulat digunakan untuk spesifikasi lebar dan ukuran buffer.
char c[4];
scanf_s("%4c", c, (unsigned)_countof(c)); // not null terminated
Untuk informasi selengkapnya, lihat scanf
Spesifikasi Lebar.
Pemetaan rutin teks generik
TCHAR.H Rutin |
_UNICODE dan _MBCS tidak ditentukan |
_MBCS Didefinisikan |
_UNICODE Didefinisikan |
---|---|---|---|
_tscanf_s |
scanf_s |
scanf_s |
wscanf_s |
_tscanf_s_l |
_scanf_s_l |
_scanf_s_l |
_wscanf_s_l |
Untuk informasi selengkapnya, lihat Memformat bidang spesifikasi: scanf
dan wscanf
fungsi.
Persyaratan
Rutin | Header yang diperlukan |
---|---|
scanf_s , _scanf_s_l |
<stdio.h> |
wscanf_s , _wscanf_s_l |
<stdio.h> atau <wchar.h> |
Konsol tidak didukung di aplikasi Platform Windows Universal (UWP). Aliran standar menangani stdin
, stdout
, dan stderr
harus dialihkan sebelum fungsi run-time C dapat menggunakannya di aplikasi UWP. Untuk informasi kompatibilitas selengkapnya, lihat Kompatibilitas.
Contoh
// 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);
}
Program ini menghasilkan output berikut ketika diberikan input ini:
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
Lihat juga
Dukungan matematika dan titik mengambang
Streaming I/O
Lokal
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