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
指令外,字面匹配和被抑制作业的成功是无法直接确定的。