Scanf scan stream input atau string yang dikodekan UTF8 dan membuat data output sesuai dengan string format. Ini meniru perilaku fungsi-C dengan nama yang sama.
Julia> Menggunakan scanf Julia> r, a, b = @scanf ("13 Ini adalah bilangan prima", "%d%[a-za-z]", int, string) (2, 13, "Ini adalah bilangan prima")# kumpulkan data dalam tuplejulia yang bahagia> r, t ... = @scanf "1 2 -inf 4 U4119" "%d%u%e%x%s" 0 uint 0.0 int "” (5, 1, 0x00000000000002, -inf, 4, "䄙")# pindai string waktu -waktu -Perhatikan bagian S dan MS menggunakan nilai defaultjulia> f = scanf.format "%d.% 2d.%2d%*1 [t]%2d:%2d:%2d.%3d "; Julia> r, y, m, d, h, m, s, ms = scanf ("2021.07.04t15: 53", f, int, nol (int8, 5) ..., int16) (5, 2021, 7, 4, 15, 53, 0, 0)
Scanf
menyediakan makro r, a,... = @scanf([io, ] "format_string", args...)
dan fungsi r, a,... = scanf(io, f::Scanf.Format, args...)
.
String format harus berupa string literal, yang dievaluasi sekali pada waktu ekspansi makro.
Atau f = Scanf.format"format_string"
atau f = Scanf.Format(::AbstractString)
Buat objek format, yang dapat digunakan dalam panggilan fungsi.
Argumennya adalah nilai default dari tipe Real
, AbstractChar
, AbstractString
, Ptr
, AbstractVector{Char}
.
Mereka juga mungkin merupakan subtipe konkret dari Real
, AbstractChar
, AbstractString
, Ptr
.
Spesifikasi format numerik kompatibel dengan argumen dan String
numerik. Kesalahan konversi dapat terjadi (float => int).
Jika tipe arg numerik tidak cukup lebar untuk nilai, nilai batas dengan tanda yang benar disimpan (misalnya Inf
, -0.0
).
Format penentu c
, s
, [
semuanya kompatibel dengan argumen Char
, Char[]
, dan String
. Dalam kasus Char
karakter pertama dari suatu string diambil.
Semua data output dikembalikan sebagai tuple termasuk jumlah nilai yang ditetapkan sebagai elemen pertama. Jika nilai tidak dapat diuraikan, nilai default ditetapkan. Dalam hal tidak ada nilai dalam elemen arg
yang sesuai, nilai default diturunkan bentuk T
.
Jika argumen default adalah objek Vector
, nilai output juga disimpan di dalamnya.
String format mengikuti definisi referensi C ++-SCANF C ++ dengan beberapa adaptasi:
Semua karakter Unicode didukung dalam string format dan data input.
Dalam string format, spesifikasi whitespace hanyalah karakter spasi ASCII di " nrtfv"
.
Dalam data input, semua karakter x
dengan isspace(x) == true
dilewati oleh specifier whitespace apa pun dalam string format.
Bentuk spesifikasi format %n$...
tidak didukung.
Pengubah tipe opsional seperti h
, l
, L
dll diabaikan; Jenis target berasal dari argumen default yang sesuai.
Untuk tipe specifier %c
, tanpa width
yang ditentukan, argumen yang sesuai harus memiliki tipe Char
atau String
.
Untuk tipe specifier %Nc
, dengan bidang lebar N
, argumen harus memiliki String
tipe atau Vector{Char}
. Vektor ini digunakan kembali dan diubah ukurannya menjadi jumlah karakter yang sebenarnya dibaca.
Tipe specifier %n
, mengembalikan nilai integer, yang merupakan offset karakter dalam data input, yang dikonsumsi oleh pemindaian ini sejauh ini.
Tipe specifier %p
membutuhkan argumen default Ptr
.
Nilai pengembalian dari kedua panggilan adalah jumlah argumen output, diikuti oleh semua data output, yang trailing mungkin nilai default. Berbeda dengan C dan C ++, juga argumen untuk %n
dihitung.
Jika aliran input habis sebelum karakter dibaca, EOF -indikator -1
dikembalikan sebagai pengganti jumlah nilai yang ditetapkan.
Untuk penentu format "whitespace", sejumlah karakter (juga nol) x
dengan isspace(x) == true
dikonsumsi dari aliran input.
Untuk karakter literal specifier format, karakter berikutnya dibaca dan dibandingkan dengan karakter literal. Jika sama, dikonsumsi, jika tidak, prosesnya gagal.
Jika format specifier "karakter" %c
diproses, setidaknya satu karakter dibaca dan ditugaskan ke argumen output. Jika tidak ada karakter yang tersedia, prosesnya gagal.
Jika format specifier %n
diproses, tidak ada data yang dikonsumsi (dan tidak ada EOF yang dikembalikan), tetapi posisi baca saat ini dikembalikan.
Berasal dari referensi C ++
Fungsi scanf
membaca input dari aliran yang ditunjukkan oleh io
, di bawah kendali format
string yang menentukan urutan input yang dapat diterima dan bagaimana mereka akan ditafsirkan, menggunakan argumen selanjutnya untuk menentukan jenis input yang dikonversi. Jumlah argumen harus sesuai dengan jumlah penentu format yang diperlukan oleh format.
Formatnya terdiri dari nol atau lebih arahan: satu atau lebih (ASCII) karakter ruang putih, karakter biasa (UTF8) (baik '%'
maupun karakter ruang putih (ASCII)), atau spesifikasi konversi. Setiap spesifikasi konversi diperkenalkan oleh karakter '%'
. Setelah '%'
, berikut ini muncul secara berurutan:
Karakter penekan penugasan opsional '*'
.
Integer desimal opsional lebih besar dari nol yang menentukan lebar bidang maksimum (dalam karakter).
Pengubah panjang opsional yang tidak digunakan oleh implementasi ini.
Karakter spesifikasi konversi yang menentukan jenis konversi yang akan diterapkan.
Fungsi scanf
mengeksekusi setiap arahan format secara bergantian. Ketika semua arahan telah dieksekusi, atau jika arahan gagal (sebagaimana dirinci di bawah), fungsi kembali. Kegagalan digambarkan sebagai kegagalan input (karena terjadinya kesalahan pengkodean atau tidak tersedianya karakter input), atau kegagalan pencocokan (karena input yang tidak tepat).
Arahan yang terdiri dari karakter ruang putih (s) dieksekusi dengan membaca input hingga karakter non-kulit putih pertama (yang tetap belum dibaca), atau sampai tidak ada lagi karakter yang dapat dibaca. Petunjuk tidak pernah gagal.
Arahan yang merupakan karakter biasa dieksekusi dengan membaca karakter berikutnya dari aliran. Jika karakter itu berbeda dari arahan, arahan gagal dan karakter yang berbeda dan selanjutnya tetap belum dibaca. Demikian pula, jika end-of-file, kesalahan penyandian, atau kesalahan baca mencegah karakter yang dibaca, arahan gagal.
Petunjuk yang merupakan spesifikasi konversi mendefinisikan satu set sekuens input yang cocok, seperti yang dijelaskan di bawah ini untuk setiap spesifikasi. Spesifikasi konversi dijalankan dalam langkah -langkah berikut:
Input karakter ruang putih (sebagaimana ditentukan oleh fungsi isspace
) dilewati, kecuali spesifikasinya mencakup spesifikasi '['
, 'c'
, atau 'n'
. Karakter ruang putih ini tidak dihitung terhadap lebar bidang yang ditentukan.
Item input dibaca dari aliran, kecuali spesifikasinya mencakup spesifikasi 'n'
. Item input didefinisikan sebagai urutan terpanjang dari karakter input yang tidak melebihi lebar bidang yang ditentukan dan mana yang, atau merupakan awalan, urutan input yang cocok.
Karakter pertama, jika ada, setelah item input tetap belum dibaca. Jika panjang item input adalah nol, eksekusi arahan gagal; Kondisi ini adalah kegagalan yang cocok kecuali end-of-file, kesalahan pengkodean, atau kesalahan baca mencegah input dari aliran, dalam hal ini merupakan kegagalan input.
Kecuali dalam kasus spesifikasi '%'
, item input (atau, dalam kasus arahan '%n'
, jumlah karakter input) dikonversi ke tipe yang sesuai dengan specifier konversi dan argumen yang sesuai. Jika item input bukan urutan yang cocok, eksekusi arahan gagal: kondisi ini merupakan kegagalan yang cocok. Kecuali penindasan penugasan ditunjukkan oleh *
, hasil konversi didorong ke tuple ouput.
Jika hasil konversi tidak dapat direpresentasikan dalam jenis output, kesalahan konversi dilemparkan.
Pengubah Panjang Opsional l
, ll
, h
, hh
, L
, j
, z
, t
diterima sebelum semua karakter Specifier tipe, tetapi diabaikan.
Penentu konversi dan artinya adalah:
d
cocok dengan integer desimal yang ditandatangani secara opsional, yang formatnya sama dengan yang diharapkan untuk urutan subjek dari fungsi parse(T, _, base=10)
, di mana T
adalah jenis integer dari argumen.
i
cocok dengan integer yang ditandatangani secara opsional, yang formatnya sama dengan yang diharapkan untuk urutan subjek dari parse(T, _, base=nothing)
.
o
cocok dengan integer oktal yang ditandatangani secara opsional, yang formatnya sama dengan yang diharapkan untuk urutan subjek dari fungsi parse(T, _, base=8)
.
u
cocok dengan integer desimal yang ditandatangani secara opsional, yang formatnya sama dengan yang diharapkan untuk urutan subjek dari fungsi parse(T, _, base=10)
.
x
cocok dengan integer heksadesimal yang ditandatangani secara opsional, yang formatnya sama dengan yang diharapkan untuk urutan subjek dari fungsi parse(T, _, base=16)
.
a
, e
, f
, g
cocok dengan angka titik mengambang yang ditandatangani secara opsional, infinity
, atau NaN
, yang formatnya sama dengan yang diharapkan untuk
Urutan subjek fungsi parse(T, _)
, di mana T
adalah tipe titik mengambang.
c
cocok dengan urutan karakter dengan persis angka yang ditentukan oleh lebar bidang ( 1
jika tidak ada lebar bidang yang ada dalam arahan). Jenis argumen harus String
, Char
, atau Vector{Char}
, jika lebar bidang lebih besar dari 1
dan jenis Char
diberikan, hanya karakter pertama yang disimpan.
s
cocok dengan urutan (tidak kosong) dari karakter non-kulit putih. Jenis argumen adalah untuk c
.
[
Cocokkan urutan karakter yang tidak keras kepala dari satu set karakter yang diharapkan (scanset). Jenis argumen adalah untuk c
. Specifier konversi mencakup semua karakter berikutnya dalam string format, hingga dan termasuk braket kanan yang cocok ( ]
). Karakter antara tanda kurung (scanlist) menyusun scanset, kecuali karakter setelah braket kiri adalah sirkumflex ( ^
), dalam hal ini scanset berisi semua karakter yang tidak muncul dalam scanlist antara sirkumflex dan braket kanan. Jika specifier konversi dimulai dengan []
atau [^]
, karakter braket kanan ada di scanlist dan karakter braket kanan berikut adalah braket kanan yang cocok yang mengakhiri spesifikasi; Kalau tidak, karakter braket kanan pertama berikut adalah yang mengakhiri spesifikasi. Jika karakter A -
ada di scanlist dan bukan yang pertama, atau yang kedua di mana karakter pertama adalah ^
, atau karakter terakhir, ia mendefinisikan rentang antara karakter kiri -
dan karakter kanan -
. Urutan yang mendefinisikan rentang adalah kisaran integer dari codepoint unicode dari karakter. Rentang kosong (seperti ba
) diabaikan.
p
cocok dengan serangkaian urutan, yang sama dengan set sekuens yang dapat diproduksi oleh konversi %p
dari fungsi printf
. Argumen yang sesuai harus dari tipe Ptr{T}
di mana t mungkin jenis apa pun. Item input dikonversi ke nilai pointer dengan cara yang ditentukan implementasi. Jika item input adalah nilai yang dikonversi lebih awal selama eksekusi program yang sama, pointer yang hasilnya harus dibandingkan dengan nilai itu; Kalau tidak, perilaku konversi %p
tidak terdefinisi.
n
Tidak ada input yang dikonsumsi. Argumen yang sesuai harus berupa tipe integer, yang dikonversi jumlah karakter yang dibaca dari aliran input sejauh ini dengan panggilan ini ke fungsi scanf
. Eksekusi %n
direktif juga meningkatkan jumlah penugasan yang dikembalikan pada penyelesaian eksekusi fungsi scanf
. Jika spesifikasi konversi mencakup karakter penekan penugasan, tidak ada argumen yang dikonsumsi. Bidang lebar opsional diabaikan.
%
Cocok dengan satu karakter '%'
; Tidak ada konversi atau penugasan yang terjadi. Spesifikasi konversi lengkap adalah %%
. (Dengan kata lain, %%
diperlakukan seperti satu karakter biasa %
).
Jika spesifikasi konversi tidak valid, perilaku tidak terdefinisi.
Penentu konversi A
, E
, F
, G
, dan X
juga valid dan berperilaku sama dengan, masing -masing, a
, e
, f
, g
, dan x
.
Trailing White Space (termasuk karakter baru) dibiarkan belum dibaca kecuali dicocokkan dengan arahan. Keberhasilan kecocokan literal dan penugasan yang ditekan tidak dapat ditentukan secara langsung selain melalui arahan %n
.