Bagikan melalui


scanf_s, , _scanf_s_lwscanf_s,_wscanf_s_l

Membaca data yang diformat dari aliran input standar. Versi , , , wscanf_wscanf_lini memiliki peningkatan keamanan, seperti yang dijelaskan dalam Fitur keamanan di CRT. _scanf_lscanf

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 cparameter set [] kontrol string , C, s, Satau . 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_lfwscanf,_fwscanf_l
printf, , _printf_lwprintf,_wprintf_l
sprintf, , _sprintf_lswprintf, , _swprintf_l,__swprintf_l
sscanf, , _sscanf_lswscanf,_swscanf_l