SCANF掃描UTF8編碼的輸入流或字符串,並根據格式字符串創建輸出數據。它模仿了C-功能的行為,同名。
朱莉婭>使用scanf Julia> r,A,B = @Scanf(“ 13這是一個素數”,“%d%[a-za-z]”,int,string) (2,13,“這是一個素數”)#在快樂的tuplejulia> r中收集數據, 0 UINT 0.0 int“”(5,1,1,0x0000000000000002,-inf,4,“䄙”)#掃描日期時間字符串- 注意S和MS零件使用默認值Julia> f = scanf.format.format”%d。%d。%d。% 2d。%2d%*1 [t]%2D:%2d:%2d 。%3D”; Julia> R,Y,M,D,H,M,S,MS,MS = Scanf(“ 2021.07.04T15:53”,F,INT,ZEROS(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
則採用字符串的第一個字符。
所有輸出數據均以元組返回,包括分配值的數量作為第一個元素。如果無法解析值,則分配默認值。在沒有值的情況下,在arg
的相應元素中,默認值將派生為T
。
如果默認參數是Vector
對象,則輸出值還存儲在其中。
格式字符串遵循C ++ -Scanf C ++的定義,並帶有一些適應:
所有Unicode字符均以格式字符串和輸入數據支持。
在格式字符串中,空格指定僅是" nrtfv"
中的ASCII空間字符。
在輸入數據中,所有帶有isspace(x) == true
的x
均由格式字符串中的任何Whitespace Specifier跳過。
%n$...
不支持格式規格的形式。
可選類型的修飾符(例如h
, l
, L
等)被忽略;目標類型是從相應的默認參數得出的。
對於未指定width
類型指定%c
,相應的參數必須具有類型的Char
或String
。
對於具有寬度N
的類型Sckeifier %Nc
,該參數必須具有類型String
或Vector{Char}
。該向量被重複使用,並將其調整到實際讀取的字符數量。
類型的指定%n
,返回一個整數值,即輸入數據中的字符偏移,該scanf迄今為止消耗。
類型指示符%p
需要Ptr
默認參數。
兩個調用的返回值是輸出參數的量,其次是所有輸出數據,落後的數據可能默認值。與C和C ++相反,也計算了%n
的論點。
如果在讀取字符之前耗盡了輸入流,則返回EOF -Indicator -1
代替分配的值的數量。
對於格式說明器“ Whitespace”,從輸入流消耗了任何數量的帶有isspace(x) == true
的字符(也為零) x
。
對於格式說明符文字字符,將讀取和將下一個字符與文字字符進行比較。如果是平等的,則將其消耗,否則該過程會失敗。
如果處理格式“字符” %c
,則至少將一個字符讀取並分配給輸出參數。如果沒有字符可用,則過程失敗。
如果處理格式指定%n
,則不會消耗數據(也沒有返回的EOF),但是返回當前的讀取位置。
從C ++參考得出
scanf
函數從指向io
指向的流讀取輸入,在指定可允許的輸入序列的字符串format
下,以及如何解釋它們,使用後續參數來定義轉換後的輸入的類型。參數的數量必須匹配格式要求的格式指定符數。
該格式由零或更多指令組成:一個或多個(ASCII)的白空間字符,普通(UTF8)字符( '%'
或a(ascii)白空間字符)或轉換規範。每個轉換規範均由字符'%'
引入。在'%'
之後,以下出現以下順序:
可選分配支持字符'*'
。
一個大於零的可選十進制整數(以字符為單位)。
該實現未使用的可選長度修飾符。
轉換指定字符,指定要應用的轉換類型。
scanf
函數依次執行格式的每個指令。當執行所有指令或指令失敗時(如下所述),該功能將返回。故障被描述為輸入故障(由於出現編碼錯誤或輸入字符的不可用)或匹配失敗(由於輸入不適當)。
通過讀取輸入到第一個非白色空間字符(尚未讀取),或直到無法讀取更多字符之前,可以執行由白空間字符組成的指令。該指令永遠不會失敗。
通過閱讀流的下一個字符來執行一個普通字符的指令。如果該字符與指令不同,則指令失敗,並且不同和後續字符仍未讀。同樣,如果文件結束,編碼錯誤或讀取錯誤會阻止字符被讀取,則指令失敗。
作為轉換規範的指令定義了一組匹配的輸入序列,如下所述,每個說明符。在以下步驟中執行了轉換規範:
輸入白空間字符(按isspace
函數指定)將被跳過,除非規格包括'['
, 'c'
或'n'
指定符)。這些白色空間字符不計入指定的字段寬度。
除非規格包括'n'
說明符),否則輸入項目是從流中讀取的。 輸入項定義為最長的輸入字符序列,該序列不超過任何指定的字段寬度,並且是匹配的輸入序列的前綴。
輸入項之後的第一個字符(如果有)仍未讀。如果輸入項目的長度為零,則指令的執行失敗;除非文件終止,編碼錯誤或讀取錯誤阻止流的輸入,否則該條件是匹配的故障,在這種情況下,這是輸入失敗。
除了'%'
指示符,輸入項目(或者,在'%n'
指令的情況下,輸入字符計數)將轉換為適合轉換說明符和相應參數的類型。如果輸入項不是匹配序列,則指令的執行失敗:此條件是匹配的失敗。除非通過a *
表示抑制,否則將轉換的結果推到了Ouput元組。
如果轉換的結果無法在輸出類型中表示,則會拋出轉換誤差。
可選的長度修飾符l
, ll
, h
, hh
, L
, j
, z
, t
在所有類型的指定字符之前都接受,但卻被忽略了。
轉換指定及其含義是:
d
匹配一個可選的簽名的十進制整數,其格式與parse(T, _, base=10)
函數的預期相同,其中T
是參數的整數類型。
i
匹配了一個可選的簽名整數,其格式與parse(T, _, base=nothing)
函數相同。
o
匹配一個可選簽名的八進制整數,其格式與parse(T, _, base=8)
函數的預期相同。
u
匹配一個可選的簽名的十進制整數,其格式與parse(T, _, base=10)
函數的預期相同。
x
匹配一個可選簽名的十六進制整數,其格式與TheW 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
一樣。轉換說明符包括格式字符串中的所有後續字符,直至和包括匹配的右括號( ]
)。括號(掃描列表)之間的字符構成了掃描儀,除非左括號後的字符是一個圓周( ^
),在這種情況下,SCANSET包含所有不出現在外圍式和右支架之間的掃描列表中的字符。如果轉換說明符以[]
或[^]
開頭,則右支架字符在掃描列表中,下一個接下來的右括號字符是結束規範的匹配右支架。否則,第一個右括號字符是結束規範的字符。如果-
字符在掃描列表中,不是第一個字符是a ^
第二個字符,也不是最後一個字符,則定義 - -
左的字符與-
的右字符之間的範圍。定義範圍的順序是字符的Unicode編碼點的整數範圍。空範圍(如ba
)被忽略。
p
匹配一組序列,該序列與printf
功能的%p
轉換可能產生的序列集相同。相應的參數必須是類型Ptr{T}
其中t可能是任何類型。輸入項以實現定義的方式轉換為指針值。 如果輸入項目是在同一程序執行期間較早轉換的值,則結果的指針應比較該值。否則%p
轉換的行為是不確定的。
n
沒有輸入。相應的參數必須是一個整數類型,將其轉換為轉換為從輸入流讀取的字符數,然後通過此調用到scanf
函數。執行一個%n
指令確實可以增加執行scanf
函數時返回的分配數量。如果轉換規範包括一個分配支持字符,則不會消耗參數。可選的寬度場被忽略。
%
與單個'%'
字符匹配;沒有發生轉換或分配。完整的轉換規範是%%
。 (換句話說, %%
被視為一個普通字符%
)。
如果轉換規範無效,則行為是不確定的。
轉換指定A
, E
, F
, G
和X
也有效,並且表現分別與a
, e
, f
, g
和x
相同。
除非由指令匹配,否則尾隨的白色空間(包括新的字符)將未讀。除了通過%n
指令外,字面匹配和被抑製作業的成功是無法直接確定的。