Bagikan melalui


scanf spesifikasi lebar

Informasi ini berlaku untuk interpretasi string format dalam scanf keluarga fungsi, termasuk versi aman seperti scanf_s. Fungsi-fungsi ini biasanya mengasumsikan aliran input dibagi menjadi urutan token. Token dipisahkan oleh spasi kosong (spasi, tab, atau baris baru), atau untuk jenis numerik, dengan akhir alami tipe data numerik seperti yang ditunjukkan oleh karakter pertama yang tidak dapat dikonversi menjadi teks numerik. Namun, spesifikasi lebar dapat digunakan untuk menyebabkan penguraian input berhenti sebelum akhir alami token.

width Spesifikasi terdiri dari karakter antara % dan penentu bidang jenis, yang dapat mencakup bilangan bulat positif yang disebut width bidang dan satu atau beberapa karakter yang menunjukkan ukuran bidang, yang juga dapat dianggap sebagai pengubah jenis bidang, seperti indikasi apakah jenis bilangan bulat adalah short atau long. Karakter tersebut disebut sebagai awalan ukuran.

Bidang width

Bidang width adalah bilangan bulat desimal positif yang mengontrol jumlah maksimum karakter yang akan dibaca untuk bidang tersebut. Tidak lebih dari width karakter dikonversi dan disimpan dalam yang sesuai argument. Kurang dari width karakter dapat dibaca jika karakter spasi kosong atau karakter yang tidak dapat dikonversi sesuai dengan format yang diberikan terjadi sebelum width tercapai.

Spesifikasi lebar terpisah dan berbeda dari argumen ukuran buffer yang diperlukan oleh versi aman fungsi-fungsi ini (misalnya, scanf_s, wscanf_s, dan sebagainya). Dalam contoh berikut, spesifikasi lebar adalah 20, menunjukkan bahwa hingga 20 karakter akan dibaca dari aliran input. Panjang buffer adalah 21, yang mencakup ruang untuk kemungkinan 20 karakter ditambah terminator null:

char str[21];
scanf_s("%20s", str, 21);

width Jika bidang tidak digunakan, scanf_s upaya untuk membaca seluruh token ke dalam string. Jika ukuran yang ditentukan tidak cukup besar untuk menahan seluruh token, tidak ada yang ditulis ke string tujuan. width Jika bidang ditentukan, maka karakter pertama width dalam token akan ditulis ke string tujuan, bersama dengan terminator null.

Awalan ukuran

Awalan hopsional , , hh, lll, I64, , dan L menunjukkan ukuran argument (karakter byte tunggal atau karakter lebar yang panjang atau pendek, tergantung pada karakter jenis yang mereka ubah). Karakter spesifikasi format ini digunakan dengan karakter jenis dalam scanf atau wscanf fungsi untuk menentukan interpretasi argumen seperti yang ditunjukkan dalam tabel berikut. Awalan I64 jenis adalah ekstensi Microsoft dan tidak kompatibel dengan Standard C. Karakter jenis dan maknanya dijelaskan dalam tabel "Ketik Karakter untuk fungsi pemindaian" dalam scanf jenis karakter bidang.

Catatan

hAwalan , l, dan L adalah ekstensi Microsoft saat digunakan dengan data jenis char.

Prefiks ukuran untuk scanf penentu jenis format dan wscanf

Untuk menentukan Gunakan awalan Dengan penentu tipe
double l e, E, f, g, atau G
long double (sama seperti double) L e, E, f, g, atau G
long int l d, i, o, x, atau X
long unsigned int l u
long long ll d, i, o, x, atau X
short int h d, i, o, x, atau X
short unsigned int h u
char hh d, i, o, x, atau X
unsigned char hh u
int64 I64 d, i, o, u, x, atau X
Karakter byte tunggal dengan scanf h c atau C
Karakter byte tunggal dengan wscanf h c atau C
Karakter lebar dengan scanf l c atau C
Karakter lebar dengan wscanf l c, atau C
String karakter byte tunggal dengan scanf h s atau S
String karakter byte tunggal dengan wscanf h s atau S
String karakter lebar dengan scanf l s atau S
String karakter lebar dengan wscanf l s atau S

Contoh berikut menggunakan h dan l dengan scanf_s fungsi dan wscanf_s fungsi:

scanf_s("%ls", &x, 2);     // Read a wide-character string
wscanf_s(L"%hC", &x, 2);    // Read a single-byte character

Jika menggunakan fungsi yang tidak aman dalam scanf keluarga, hilangkan parameter ukuran yang menunjukkan panjang buffer argumen sebelumnya.

Membaca string yang tidak dibatasi

Untuk membaca string yang tidak dibatasi oleh karakter spasi kosong, sekumpulan karakter dalam tanda kurung ([ ]) dapat digantikan untuk s karakter jenis (string). Kumpulan karakter dalam tanda kurung disebut sebagai string kontrol. Bidang input yang sesuai dibaca hingga karakter pertama yang tidak muncul dalam string kontrol. Jika karakter pertama dalam set adalah tanda sisipan (^), efeknya dibalik: Bidang input dibaca hingga karakter pertama yang muncul di sisa kumpulan karakter.

Keduanya %[a-z] dan %[z-a] ditafsirkan setara dengan %[abcde...z]. Ini adalah ekstensi fungsi umum scanf , tetapi tidak diperlukan oleh Standard C.

Membaca string yang tidak ditentukan

Untuk menyimpan string tanpa menyimpan karakter null yang mengakhiri ('\0'), gunakan spesifikasi %Nc, di mana N adalah bilangan bulat desimal. Dalam hal ini, c karakter jenis menunjukkan bahwa argumen adalah penunjuk ke array karakter. Karakter N berikutnya dibaca dari aliran input ke lokasi yang ditentukan, dan tidak ada karakter null ('\0') yang ditambahkan. Jika N tidak ditentukan, nilai defaultnya adalah 1.

Saat scanf berhenti membaca bidang

Fungsi scanf ini memindai setiap bidang input, karakter menurut karakter. Ini mungkin berhenti membaca bidang input tertentu sebelum mencapai karakter spasi karena salah satu dari beberapa alasan:

  • Lebar yang ditentukan telah tercapai.

  • Karakter berikutnya tidak dapat dikonversi seperti yang ditentukan.

  • Karakter berikutnya berkonflik dengan karakter dalam string kontrol yang seharusnya cocok.

  • Karakter berikutnya gagal muncul dalam kumpulan karakter tertentu.

Untuk alasan apa pun, ketika scanf fungsi berhenti membaca bidang input, bidang input berikutnya dianggap dimulai pada karakter pertama yang belum dibaca. Karakter yang bertentangan, jika ada, dianggap belum dibaca. Ini adalah karakter pertama dari bidang input berikutnya, atau karakter pertama dalam operasi baca berikutnya pada aliran input.

Lihat juga

scanf, , _scanf_lwscanf,_wscanf_l
scanf_s, , _scanf_s_lwscanf_s,_wscanf_s_l
Bidang spesifikasi format: scanf dan wscanf fungsi
scanf ketik karakter bidang