Scanf สแกนสตรีมอินพุตหรือสตริงที่เข้ารหัส UTF8 ที่เข้ารหัสและสร้างข้อมูลเอาต์พุตตามสตริงรูปแบบ มันเลียนแบบพฤติกรรมของ C-function ด้วยชื่อเดียวกัน
Julia> ใช้ scanf Julia> r, a, b = @scanf ("13 นี่คือจำนวนที่สำคัญ", "%d%[a-za-z]", int, string) (2, 13, "นี่คือตัวเลขที่สำคัญ")# รวบรวมข้อมูลใน tuplejulia ที่มีความสุข> r, t ... = @scanf "1 2 -inf 4 U4119" "%d%u%e%x%s" 0 UINT 0.0 int "" (5, 1, 0x0000000000000002, -inf, 4, "䄙")# สแกนสตริงเวลาวันที่ -หมายเหตุชิ้นส่วน S และ MS ใช้ค่าเริ่มต้น 2d.%2d%*1 [t]%2d:%2d:%2d.%3d "; Julia> r, y, m, d, h, m, s, ms = scanf ("2021.07.04t15: 53", f, int, ศูนย์ (int8, 5) ... , int16) (5, 2021, 7, 4, 15, 53, 0, 0)
Scanf
ให้มาโคร r, a,... = @scanf([io, ] "format_string", args...)
และฟังก์ชั่น r, a,... = scanf(io, f::Scanf.Format, args...)
สตริงรูปแบบจะต้องเป็นตัวอักษรสตริงซึ่งจะถูกประเมินหนึ่งครั้งที่เวลาการขยายตัวของแมโคร
อีกทางเลือกหนึ่ง f = Scanf.format"format_string"
หรือ f = Scanf.Format(::AbstractString)
สร้างวัตถุรูปแบบซึ่งสามารถใช้ในการเรียกใช้ฟังก์ชัน
อาร์กิวเมนต์เป็นค่าเริ่มต้นของประเภท Real
, AbstractChar
, AbstractString
, Ptr
, AbstractVector{Char}
พวกเขาอาจเป็นชนิดย่อยที่เป็นรูปธรรมของ Real
, AbstractChar
, AbstractString
, Ptr
ตัวระบุรูปแบบตัวเลขเข้ากันได้กับอาร์กิวเมนต์ตัวเลขและ String
ข้อผิดพลาดในการแปลงอาจเกิดขึ้น (float => int)
หากประเภท ARG ตัวเลขไม่กว้างพอสำหรับค่าค่าขอบเขตที่มีเครื่องหมายที่ถูกต้องจะถูกเก็บไว้ (เช่น Inf
, -0.0
)
ตัวระบุรูปแบบ c
, s
, [
ทั้งหมดเข้ากันได้กับอาร์กิวเมนต์ Char
, Char[]
และ String
ในกรณีของ Char
อักขระตัวแรกของสตริงจะถูกถ่าย
ข้อมูลเอาต์พุตทั้งหมดจะถูกส่งคืนเป็น tuple รวมถึงจำนวนของค่าที่กำหนดเป็นองค์ประกอบแรก หากไม่สามารถแยกวิเคราะห์ค่าได้ค่าเริ่มต้นจะถูกกำหนด ในกรณีที่ไม่มีค่าอยู่ในองค์ประกอบที่สอดคล้องกันของ arg
ค่าเริ่มต้นจะได้รับแบบฟอร์ม T
หากอาร์กิวเมนต์เริ่มต้นเป็นวัตถุ Vector
ค่าเอาต์พุตจะถูกเก็บไว้เพิ่มเติมในนั้น
สตริงรูปแบบเป็นไปตามคำจำกัดความของการอ้างอิง C ++-SCANF C ++ ด้วยการดัดแปลงบางอย่าง:
อักขระ Unicode ทั้งหมดได้รับการสนับสนุนในสตริงรูปแบบและข้อมูลอินพุต
ในสตริงรูปแบบตัวระบุช่องว่างเป็นเพียงอักขระ ASCII Space ใน " nrtfv"
ในข้อมูลอินพุตอักขระทั้งหมด x
ที่มี isspace(x) == true
ถูกข้ามโดยตัวระบุช่องว่างใด ๆ ในสตริงรูปแบบ
ไม่รองรับรูปแบบ %n$...
ตัวดัดแปลงประเภทเสริมเช่น h
, l
, L
ฯลฯ จะถูกละเว้น ประเภทเป้าหมายมาจากอาร์กิวเมนต์เริ่มต้นที่สอดคล้องกันแทน
สำหรับประเภท specifier %c
โดยไม่ระบุ width
อาร์กิวเมนต์ที่เกี่ยวข้องจะต้องมี Char
หรือ String
ประเภท
สำหรับประเภท specifier %Nc
ที่มีฟิลด์ความกว้าง N
อาร์กิวเมนต์จะต้องมีประเภท String
หรือ Vector{Char}
เวกเตอร์นี้ถูกนำกลับมาใช้ใหม่และปรับขนาดตามจำนวนอักขระที่อ่านจริง
ประเภทตัวระบุ %n
, ส่งคืนค่าจำนวนเต็มซึ่งเป็นตัวละครชดเชยในข้อมูลอินพุตที่ใช้โดย scanf นี้จนถึงตอนนี้
ประเภทตัวระบุ %p
ต้องใช้อาร์กิวเมนต์เริ่มต้น Ptr
ค่าส่งคืนของการโทรทั้งสองคือจำนวนอาร์กิวเมนต์เอาต์พุตตามด้วยข้อมูลเอาต์พุตทั้งหมดค่าที่ตามมาอาจเป็นค่าเริ่มต้น ตรงกันข้ามกับ C และ C ++ จะมีการนับอาร์กิวเมนต์ %n
หากสตรีมอินพุตหมดก่อนที่จะอ่านอักขระ EOF -indicator -1
จะถูกส่งคืนแทนจำนวนของค่าที่กำหนด
สำหรับตัวระบุรูปแบบ "ช่องว่าง" จำนวนอักขระใด ๆ (เช่นศูนย์) x
ด้วย isspace(x) == true
จะถูกใช้จากสตรีมอินพุต
สำหรับตัวอักษรตัวระบุรูปแบบตัวละครตัวละครตัวต่อไปจะถูกอ่านและเปรียบเทียบกับตัวละครที่แท้จริง หากเท่ากันมันจะถูกใช้ไปมิฉะนั้นกระบวนการจะล้มเหลว
หากตัวระบุรูปแบบ "อักขระ" %c
ถูกประมวลผลอย่างน้อยตัวละครจะถูกอ่านและกำหนดให้กับอาร์กิวเมนต์เอาต์พุต หากไม่มีอักขระกระบวนการจะล้มเหลว
หากตัวระบุรูปแบบ %n
ถูกประมวลผลจะไม่มีการใช้ข้อมูล (และไม่มีการส่งคืน EOF) แต่ตำแหน่งการอ่านปัจจุบันจะถูกส่งคืน
ได้มาจากการอ้างอิง C ++
ฟังก์ชั่น scanf
อ่านอินพุตจากสตรีมที่ชี้ไปที่ io
ภายใต้การควบคุมของ format
สตริงที่ระบุลำดับอินพุตที่ยอมรับได้และวิธีการตีความที่จะตีความโดยใช้อาร์กิวเมนต์ที่ตามมาเพื่อกำหนดประเภทของอินพุตที่แปลงแล้ว จำนวนอาร์กิวเมนต์จะต้องตรงกับจำนวนตัวระบุรูปแบบที่ต้องการโดยรูปแบบ
รูปแบบประกอบด้วยคำสั่งเป็นศูนย์หรือมากกว่า: อักขระอวกาศสีขาว (ASCII) หนึ่งตัวหรือมากกว่า (ASCII) อักขระธรรมดา (UTF8) (ไม่ '%'
หรือ A (ASCII) อักขระพื้นที่สีขาว) หรือข้อกำหนดการแปลง ข้อมูลจำเพาะการแปลงแต่ละตัวจะถูกนำเสนอโดยตัวละคร '%'
หลังจาก '%'
สิ่งต่อไปนี้จะปรากฏตามลำดับ:
อักขระเสริมการมอบหมายงานที่ได้รับมอบหมาย '*'
จำนวนเต็มทศนิยมเสริมมากกว่าศูนย์ที่ระบุความกว้างของฟิลด์สูงสุด (เป็นอักขระ)
ตัวดัดแปลงความยาวเสริมที่ไม่ได้ใช้โดยการใช้งานนี้
อักขระตัวระบุการแปลงที่ระบุประเภทของการแปลงที่จะใช้
ฟังก์ชั่น scanf
ดำเนินการแต่ละคำสั่งของรูปแบบในทางกลับกัน เมื่อมีการดำเนินการคำสั่งทั้งหมดหรือหากคำสั่งล้มเหลว (ตามรายละเอียดด้านล่าง) ฟังก์ชั่นจะกลับมา ความล้มเหลวถูกอธิบายว่าเป็นความล้มเหลวของอินพุต (เนื่องจากการเกิดข้อผิดพลาดในการเข้ารหัสหรือการไม่พร้อมใช้งานของอักขระอินพุต) หรือความล้มเหลวในการจับคู่ (เนื่องจากอินพุตที่ไม่เหมาะสม)
คำสั่งที่ประกอบด้วยอักขระอวกาศสีขาวจะถูกดำเนินการโดยการอ่านอินพุตเป็นอักขระที่ไม่ใช่อวกาศสีขาวตัวแรก (ซึ่งยังไม่ได้อ่าน) หรือจนกว่าจะไม่สามารถอ่านอักขระได้อีก คำสั่งไม่เคยล้มเหลว
คำสั่งที่เป็นอักขระธรรมดาถูกดำเนินการโดยการอ่านอักขระถัดไปของสตรีม หากตัวละครนั้นแตกต่างจากคำสั่งคำสั่งล้มเหลวและอักขระที่แตกต่างและต่อมายังไม่ได้อ่าน ในทำนองเดียวกันหากสิ้นสุดไฟล์ข้อผิดพลาดการเข้ารหัสหรือข้อผิดพลาดในการอ่านจะป้องกันไม่ให้ตัวละครอ่านคำสั่งล้มเหลว
คำสั่งที่เป็นข้อกำหนดการแปลงกำหนดชุดของลำดับอินพุตที่ตรงกันตามที่อธิบายไว้ด้านล่างสำหรับแต่ละตัวระบุ ข้อมูลจำเพาะการแปลงจะดำเนินการในขั้นตอนต่อไปนี้:
อักขระสเปซสีขาวอินพุต (ตามที่ระบุโดยฟังก์ชั่น isspace
) จะถูกข้ามเว้นแต่ว่าข้อมูลจำเพาะจะรวมถึง '['
, 'c'
หรือ 'n'
specifier อักขระพื้นที่สีขาวเหล่านี้ไม่ได้นับรวมกับความกว้างของฟิลด์ที่ระบุ
รายการอินพุตถูกอ่านจากสตรีมเว้นแต่ว่าข้อมูลจำเพาะจะมีตัวระบุ 'n'
รายการอินพุตถูกกำหนดให้เป็นลำดับที่ยาวที่สุดของอักขระอินพุตซึ่งไม่เกินความกว้างของฟิลด์ที่ระบุใด ๆ และคือหรือเป็นคำนำหน้าของลำดับอินพุตที่ตรงกัน
อักขระตัวแรกถ้ามีหลังจากรายการอินพุตยังไม่ได้อ่าน หากความยาวของรายการอินพุตเป็นศูนย์การดำเนินการของคำสั่งล้มเหลว เงื่อนไขนี้เป็นความล้มเหลวในการจับคู่เว้นแต่ว่าสิ้นสุดไฟล์ข้อผิดพลาดการเข้ารหัสหรือข้อผิดพลาดในการอ่านป้องกันอินพุตจากสตรีมซึ่งในกรณีนี้เป็นความล้มเหลวในการป้อนข้อมูล
ยกเว้นในกรณีของตัวระบุ '%'
รายการอินพุต (หรือในกรณีของคำสั่ง '%n'
จำนวนอักขระอินพุต) จะถูกแปลงเป็นประเภทที่เหมาะสมกับตัวระบุการแปลงและอาร์กิวเมนต์ที่สอดคล้องกัน หากรายการอินพุตไม่ใช่ลำดับการจับคู่การดำเนินการของคำสั่งล้มเหลว: เงื่อนไขนี้เป็นความล้มเหลวในการจับคู่ เว้นแต่ว่าการปราบปรามการมอบหมายจะถูกระบุโดย A *
ผลลัพธ์ของการแปลงจะถูกผลักไปที่ tuple ouput
หากผลลัพธ์ของการแปลงไม่สามารถแสดงในประเภทเอาต์พุตข้อผิดพลาดการแปลงจะถูกโยน
ตัวดัดแปลงความยาวเป็นตัวเลือก l
, ll
, h
, hh
, L
, j
, z
, t
ได้รับการยอมรับก่อนที่จะมีอักขระตัวระบุประเภททั้งหมด แต่ไม่สนใจ
ตัวระบุการแปลงและความหมายของพวกเขาคือ:
d
ตรงกับจำนวนเต็มทศนิยมที่ลงนามทางเลือกซึ่งรูปแบบเหมือนกับที่คาดไว้สำหรับลำดับหัวเรื่องของ parse(T, _, base=10)
ฟังก์ชั่นโดยที่ T
คือประเภทจำนวนเต็มของอาร์กิวเมนต์
i
จับคู่จำนวนเต็มที่ลงนามทางเลือกซึ่งรูปแบบเหมือนกับที่คาดไว้สำหรับลำดับหัวเรื่องของฟังก์ชั่น parse(T, _, base=nothing)
o
จับคู่กับจำนวนเต็ม Octal ที่ลงนามซึ่งเป็นตัวเลือกซึ่งรูปแบบเหมือนกับที่คาดไว้สำหรับลำดับหัวเรื่องของฟังก์ชั่น parse(T, _, base=8)
u
ตรงกับจำนวนเต็มทศนิยมที่ลงนามทางเลือกซึ่งมีรูปแบบเหมือนกับที่คาดไว้สำหรับลำดับหัวเรื่องของฟังก์ชัน parse(T, _, base=10)
x
ตรงกับจำนวนเต็ม hexadecimal ที่ลงนามซึ่งเป็นตัวเลือกซึ่งรูปแบบเหมือนกับที่คาดไว้สำหรับลำดับหัวเรื่องของ parse(T, _, base=16)
ฟังก์ชั่น
a
, e
, f
, g
ตรงกับหมายเลขโฟลติ้งที่มีการลงนามแบบไม่มีทางเลือก infinity
หรือ NaN
ซึ่งมีรูปแบบเหมือนกับที่คาดไว้สำหรับ
ลำดับหัวเรื่องของฟังก์ชั่น parse(T, _)
โดยที่ T
คือประเภทจุดลอยตัว
c
ตรงกับลำดับของอักขระของหมายเลขที่ระบุโดยความกว้างของฟิลด์ ( 1
หากไม่มีความกว้างของฟิลด์อยู่ในคำสั่ง) ประเภทอาร์กิวเมนต์จะต้องเป็น String
, Char
หรือ Vector{Char}
หากความกว้างของฟิลด์มากกว่า 1
และประเภท Char
จะได้รับเฉพาะอักขระตัวแรกเท่านั้นที่เก็บไว้
s
จับคู่ลำดับ (ไม่ว่างเปล่า) ของอักขระที่ไม่ใช่พื้นที่สีขาว ประเภทอาร์กิวเมนต์มีไว้สำหรับ c
[
ตรงกับลำดับอักขระที่ไม่ได้รับการยกเว้นจากชุดของอักขระที่คาดหวัง (Scanset) ประเภทอาร์กิวเมนต์มีไว้สำหรับ c
ตัวระบุการแปลงรวมถึงอักขระที่ตามมาทั้งหมดในสตริงรูปแบบจนถึงและรวมถึงตัวยึดขวาที่ตรงกัน ( ]
) อักขระระหว่างวงเล็บ (scanlist) เขียน scanset เว้นแต่ตัวละครหลังจากตัวยึดซ้ายเป็น circumflex ( ^
) ซึ่งในกรณีนี้ scanset มีตัวละครทั้งหมดที่ไม่ปรากฏใน scanlist ระหว่าง circumflex และวงเล็บขวา หากตัวระบุการแปลงเริ่มต้นด้วย []
หรือ [^]
อักขระวงเล็บด้านขวาอยู่ในสแกนลิสต์และตัวอักษรตัวยึดด้านขวาถัดไปคือตัวยึดด้านขวาที่ตรงกันที่สิ้นสุดข้อมูลจำเพาะ; มิฉะนั้นอักขระตัวยึดด้านขวาต่อไปนี้คือตัวละครที่จบลงตามข้อกำหนด หากตัว -
อยู่ในสแกนลิสต์และไม่ใช่ตัวแรกหรือตัวที่สองที่ตัวละครตัวแรกคือ ^
หรือตัวละครตัวสุดท้ายมันจะกำหนดช่วงระหว่างตัวละครด้านซ้ายของ -
และตัวละครขวาของ -
คำสั่งที่กำหนดช่วงคือช่วงจำนวนเต็มของ codepoints Unicode ของอักขระ ช่วงที่ว่างเปล่า (เช่น ba
) ถูกละเว้น
p
จับคู่ชุดลำดับซึ่งเหมือนกับชุดของลำดับที่อาจเกิดจากการแปลง %p
ของ printf
-function อาร์กิวเมนต์ที่สอดคล้องกันจะต้องเป็นประเภท Ptr{T}
โดยที่ t อาจเป็นประเภทใดก็ได้ รายการอินพุตจะถูกแปลงเป็นค่าตัวชี้ในลักษณะที่กำหนดการนำไปใช้งาน หากรายการอินพุตเป็นค่าที่แปลงก่อนหน้านี้ในระหว่างการดำเนินการโปรแกรมเดียวกันตัวชี้ที่ผลลัพธ์จะเปรียบเทียบเท่ากับค่านั้น มิฉะนั้นพฤติกรรมของการแปลง %p
จะไม่ได้กำหนด
n
การป้อนข้อมูล อาร์กิวเมนต์ที่สอดคล้องกันจะต้องเป็นประเภทจำนวนเต็มซึ่งจะถูกแปลงจำนวนอักขระที่อ่านจากสตรีมอินพุตจนถึงตอนนี้การเรียกไปยังฟังก์ชัน scanf
การดำเนินการของคำสั่ง %n
จะเพิ่มจำนวนการมอบหมายที่ส่งคืนเมื่อเสร็จสิ้นการดำเนินการของฟังก์ชัน scanf
หากข้อกำหนดการแปลงรวมถึงอักขระการระงับการมอบหมายจะไม่มีการใช้อาร์กิวเมนต์ ฟิลด์ความกว้างเสริมจะถูกละเว้น
%
ตรงกับอักขระ '%'
เดี่ยว; ไม่มีการแปลงหรือการมอบหมายเกิดขึ้น ข้อกำหนดการแปลงที่สมบูรณ์คือ %%
(ด้วยคำอื่น ๆ %%
ได้รับการปฏิบัติเหมือนตัวละครธรรมดาเพียงตัวเดียว %
)
หากข้อกำหนดการแปลงไม่ถูกต้องพฤติกรรมจะไม่ได้กำหนด
ตัวระบุการแปลง A
, E
, F
, G
และ X
นั้นถูกต้องและมีพฤติกรรมเช่นเดียวกับตามลำดับ a
, e
, f
, g
และ x
ต่อท้ายพื้นที่สีขาว (รวมถึงอักขระบรรทัดใหม่) จะยังไม่ได้อ่านเว้นแต่จะตรงกับคำสั่ง ความสำเร็จของการจับคู่ที่แท้จริงและการมอบหมายที่ถูกระงับนั้นไม่สามารถกำหนดได้โดยตรงนอกเหนือจากผ่านคำสั่ง %n