Scanf escanean transmisiones o cadenas de entrada codificadas por UTF8 y crea datos de salida de acuerdo con una cadena de formato. Mimia el comportamiento de la función C con el mismo nombre.
julia> usando scanf Julia> R, A, B = @Scanf ("13 Este es un número primo", "%d%[A-Za-Z]", int, String) (2, 13, "Este es un número primo")# recopilar datos en un feliz tuplejulia> r, t ... = @scanf "1 2 -inf 4 u4119" "%d%u%e%x%s" 0 uint 0.0 int "" (5, 1, 0x000000000000000002, -inf, 4, "䄙")# Cadena de fecha en la hora de escaneo: tenga en cuenta que las piezas S y MS usan los valores predeterminadosjulia> f = scanf.format "%d.%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, Zeros (int8, 5) ..., int16) (5, 2021, 7, 4, 15, 53, 0, 0)
Scanf
proporciona la macro r, a,... = @scanf([io, ] "format_string", args...)
y la función r, a,... = scanf(io, f::Scanf.Format, args...)
.
La cadena de formato debe ser una cadena literal, que se evalúa una vez en el tiempo de expansión macro.
Alternativamente f = Scanf.format"format_string"
o f = Scanf.Format(::AbstractString)
Cree un objeto de formato, que se puede usar en la llamada de función.
Los argumentos son valores predeterminados de tipos Real
, AbstractChar
, AbstractString
, Ptr
, AbstractVector{Char}
.
También pueden ser subtipos concretos de Real
, AbstractChar
, AbstractString
, Ptr
.
Los especificadores de formato numérico son compatibles con argumentos numéricos y String
. Los errores de conversión pueden ocurrir (float => int).
Si el tipo de arg numérico no es lo suficientemente amplio para el valor, se almacenan los valores límite con el signo correcto (por ejemplo, Inf
, -0.0
).
Los especificadores de formato c
, s
, [
son todos compatibles con los argumentos Char
, Char[]
y String
. En caso de Char
se toma el primer carácter de una cadena.
Todos los datos de salida se devuelven como una tupla que incluye el número de valores asignados como el primer elemento. Si no se puede analizar un valor, se asigna el valor predeterminado. En el caso de que ningún valor esté en el elemento correspondiente de arg
, el valor predeterminado se deriva la forma T
.
Si el argumento predeterminado es un objeto Vector
, los valores de salida se almacenan adicionalmente en él.
Las cadenas de formato siguen la definición de referencia C ++-Scanf C ++ con algunas adaptaciones:
Todos los caracteres Unicode son compatibles con cadenas de formato y datos de entrada.
En las cadenas de formato, los especificadores de espacios blancos son solo los caracteres espaciales ASCII en " nrtfv"
.
En los datos de entrada, todos los caracteres x
con isspace(x) == true
son omitidos por cualquier especificador de espacio blanco en la cadena de formato.
La forma %n$...
de especificaciones de formato no es compatible.
Se ignoran modificadores de tipo opcional como h
, l
, L
etc.; El tipo de destino se deriva del argumento predeterminado correspondiente, en su lugar.
Para el tipo de especificador %c
, sin width
especificado, el argumento correspondiente debe tener tipo Char
o String
.
Para el tipo de especificador de %Nc
, con un campo de ancho N
, el argumento debe tener String
de tipo o Vector{Char}
. Este vector se reutiliza y se redimensiona a la cantidad de caracteres que realmente leen.
El tipo de especificador %n
, devuelve un valor entero, que es la compensación de caracteres en los datos de entrada, consumido por este scanf hasta ahora.
El tipo de especificador de %p
requiere un argumento predeterminado Ptr
.
El valor de retorno de ambas llamadas es la cantidad de argumentos de salida, seguido de todos los datos de salida, los seguidos pueden tal vez valores predeterminados. A diferencia de C y C ++, también se cuentan los argumentos para %n
.
Si la secuencia de entrada se agota antes de leer un personaje, el EOF -Indicator -1
se devuelve en lugar del número de valores asignados.
Para los especificadores de formato "Whitespace", cualquier número de caracteres (también cero) x
con isspace(x) == true
se consumen de la secuencia de entrada.
Para un personaje literal especificador de formato, el siguiente personaje se lee y se compara con el carácter literal. Si es igual, se consume, de lo contrario el proceso falla.
Si se procesa el especificador de formato "carácter" %c
, al menos un carácter se lee y se asigna al argumento de salida. Si no hay carácter disponible, el proceso falla.
Si el especificador de formato %n
se procesa, no se consumen datos (y no se devuelven el EOF), pero se devuelve la posición de lectura actual.
Como derivado de la referencia de C ++
La función scanf
lee la entrada de la transmisión señalada por io
, bajo el control del format
de cadena que especifica las secuencias de entrada admisibles y cómo deben interpretarse, utilizando argumentos posteriores para definir el tipo de la entrada convertida. El número de argumentos debe coincidir con el número de especificadores de formato requeridos por el formato.
El formato está compuesto por cero o más directivas: uno o más caracteres (ASCII) del espacio blanco, un carácter ordinario (UTF8) (ni '%'
ni un carácter (ASCII) del espacio blanco), o una especificación de conversión. Cada especificación de conversión es introducida por el personaje '%'
. Después del '%'
, lo siguiente aparece en la secuencia:
Un carácter opcional supresión de asignación '*'
.
Un entero decimal opcional mayor que cero que especifica el ancho de campo máximo (en caracteres).
Un modificador de longitud opcional que no es utilizado por esta implementación.
Un carácter especificador de conversión que especifica el tipo de conversión que se aplicará.
La función scanf
ejecuta cada directiva del formato a su vez. Cuando todas las directivas se han ejecutado, o si una directiva falla (como se detalla a continuación), la función regresa. Las fallas se describen como fallas de entrada (debido a la aparición de un error de codificación o la falta de disponibilidad de los caracteres de entrada), o fallas coincidentes (debido a la entrada inapropiada).
Una directiva compuesta de carácter (s) blanco (s) de espacio blanco se ejecuta leyendo la entrada de la entrada hasta el primer carácter no espacial blanco (que no se lee), o hasta que no se puedan leer más caracteres. La directiva nunca falla.
Una directiva que es un personaje ordinario se ejecuta leyendo el siguiente carácter de la transmisión. Si ese personaje difiere de la directiva, la directiva falla y los caracteres diferentes y posteriores siguen sin leer. Del mismo modo, si el final del archivo, un error de codificación o un error de lectura evita que se lea un personaje, la directiva falla.
Una directiva que es una especificación de conversión define un conjunto de secuencias de entrada coincidentes, como se describe a continuación para cada especificador. Una especificación de conversión se ejecuta en los siguientes pasos:
Se omiten los caracteres de entrada de espacio blanco (según lo especificado por la función isspace
), a menos que la especificación incluya un especificador '['
, 'c'
o 'n'
. Estos caracteres del espacio blanco no se cuentan con un ancho de campo especificado.
Se lee un elemento de entrada del flujo, a menos que la especificación incluya un especificador 'n'
. Un elemento de entrada se define como la secuencia más larga de caracteres de entrada que no excede ningún ancho de campo especificado y que es, o es un prefijo de una secuencia de entrada coincidente.
El primer personaje, si lo hay, después del elemento de entrada permanece sin leer. Si la longitud del elemento de entrada es cero, la ejecución de la directiva falla; Esta condición es una falla correspondiente a menos que el final del archivo, un error de codificación o un error de lectura evitó la entrada de la secuencia, en cuyo caso es una falla de entrada.
Excepto en el caso de un especificador '%'
, el elemento de entrada (o, en el caso de una directiva '%n'
, el recuento de caracteres de entrada) se convierte en un tipo apropiado para el especificador de conversión y el argumento correspondiente. Si el elemento de entrada no es una secuencia coincidente, la ejecución de la directiva falla: esta condición es una falla coincidente. A menos que A *
se indicara la supresión de la asignación, el resultado de la conversión se empuja a la tupla.
Si el resultado de la conversión no se puede representar en el tipo de salida, se lanza un error de conversión.
Los modificadores de longitud opcional l
, ll
, h
, hh
, L
, j
, z
, t
se aceptan antes de todos los caracteres de especificadores de tipo, pero de lo contrario se ignoran.
Los especificadores de conversión y sus significados son:
d
coincide con un entero decimal opcionalmente firmado, cuyo formato es el mismo que se esperaba para la secuencia de sujetos de la función de parse(T, _, base=10)
, donde T
es el tipo entero del argumento.
i
coincide con un entero opcionalmente firmado, cuyo formato es el mismo que se esperaba para la secuencia de sujetos de la función parse(T, _, base=nothing)
.
o
coincide con un entero octal opcionalmente firmado, cuyo formato es el mismo que se esperaba para la secuencia de sujetos de la función de parse(T, _, base=8)
.
u
coincide con un entero decimal opcionalmente firmado, cuyo formato es el mismo que se esperaba para la secuencia de sujetos de la función de parse(T, _, base=10)
.
x
coincide con un entero hexadecimal opcionalmente firmado, cuyo formato es el mismo que se esperaba para la secuencia de sujetos de la función parse(T, _, base=16)
.
a
, e
, f
, g
coincide con un número de punto flotante opcionalmente firmado, infinity
o NaN
, cuyo formato es el mismo que se esperaba para el
Secuencia de sujeto de la función de parse(T, _)
, donde T
es un tipo de punto flotante.
c
coincide con una secuencia de caracteres de exactamente el número especificado por el ancho de campo ( 1
si no hay ancho de campo presente en la directiva). El tipo de argumento debe ser String
, Char
o Vector{Char}
, si el ancho de campo es mayor que 1
y se da un tipo Char
, solo se almacena el primer carácter.
s
coincide con una secuencia (no vacía) de caracteres no espaciales blancos. Los tipos de argumentos son como para c
.
[
Coincide con una secuencia no vacía de caracteres de un conjunto de caracteres esperados (el escaneo). Los tipos de argumentos son como para c
. El especificador de conversión incluye todos los caracteres posteriores en la cadena de formato, hasta e incluyendo el soporte derecho coincidente ( ]
). Los caracteres entre los soportes (la lista de escaneo) componen el escaneo, a menos que el personaje después del soporte izquierdo sea un circunflejo ( ^
), en cuyo caso el escaneo contiene todos los caracteres que no aparecen en la lista de escaneo entre el circunflejo y el soporte derecho. Si el especificador de conversión comienza con []
o [^]
, el carácter del soporte derecho está en la lista de escaneo y el siguiente carácter del soporte derecho siguiente es el soporte derecho coincidente que finaliza la especificación; De lo contrario, el primer carácter de soporte derecho siguiente es el que termina la especificación. Si -
personaje está en la lista de escaneo y no es el primero, ni el segundo donde el primer personaje es un ^
, ni el último carácter, define el rango entre el personaje izquierdo -
y el derecho de carácter de -
. El orden que define el rango es el rango entero de los puntos de código unicode de los caracteres. Se ignoran los rangos vacíos (como ba
).
p
coincide con un conjunto de secuencias, que son los mismos que el conjunto de secuencias que pueden producirse mediante la conversión %p
de la función printf
. El argumento correspondiente debe ser de tipo Ptr{T}
donde t puede ser cualquier tipo. El elemento de entrada se convierte en un valor de puntero de manera definida por implementación. Si el elemento de entrada es un valor convertido anteriormente durante la misma ejecución del programa, el puntero que los resultados se compararán igual a ese valor; De lo contrario, el comportamiento de la conversión %p
no está definido.
n
No se consume información. El argumento correspondiente debe ser un tipo entero, en el que se convierte el número de caracteres leídos de la secuencia de entrada hasta ahora por esta llamada a la función scanf
. La ejecución de una directiva %n
también aumenta el recuento de asignación devuelto al finalizar la ejecución de la función scanf
. Si la especificación de conversión incluye un carácter de supresión de asignación, no se consume ningún argumento. Se ignora un campo de ancho opcional.
%
Coincide con un solo carácter '%'
; No se produce conversión ni asignación. La especificación de conversión completa es %%
. (Con otras palabras, %%
se trata como un solo carácter ordinario %
).
Si una especificación de conversión no es válida, el comportamiento no está definido.
Los especificadores de conversión A
, E
, F
, G
y X
también son válidos y se comportan igual que, respectivamente, a
, e
, f
, g
y x
El espacio en blanco posterior (incluidos los caracteres de nueva línea) se deja sin leer a menos que sea coincidente por una directiva. El éxito de las coincidencias literal y las tareas suprimidas no es directamente determinable que no sea a través de la directiva %n
.