Scanf Scans UTF8-кодируемые входные потоки или строки и создает выходные данные в соответствии со строкой формата. Это имитирует поведение C-функции с тем же именем.
Юлия> Использование Scanf Julia> r, a, b = @scanf («13 Это основное число», «%d%[a-za-z]», int, String) (2, 13, «Это основное число»)# Соберите данные в Happy Tuplejulia> r, t ... = @scanf "1 2 -inf 4 U4119"%d%u%e%x%s " 0 uint 0.0 int "" (5, 1, 0x000000000000000002, -Inf, 4, "䄙")# Строка даты сканирования -примечание. Части S и MS Используются значения по умолчанию Julia> 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, 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)
Создать объект Format, который можно использовать в вызове функции.
Аргументы являются значениями по умолчанию типов 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 поддерживаются в строках формата и входных данных.
В формате струн спецификаторы пробелов являются только космическими символами ASCII в " nrtfv"
.
Во входных данных все символы x
с isspace(x) == true
пропускаются любым спецификатором пробелов в строке формата.
%n$...
форма спецификаций формата не поддерживается.
Дополнительные модификаторы типа, такие как h
, l
, L
и т. Д. И игнорируются; Целевой тип получен из соответствующего аргумента по умолчанию, вместо этого.
Для типа Specifier %c
без указанной width
соответствующий аргумент должен иметь Char
или String
.
Для типа Specifier %Nc
, с полем ширины N
, аргумент должен иметь тип String
или Vector{Char}
. Этот вектор повторно используется и изменяется до количества символов, которые фактически читают.
Type Specifier %n
возвращает целочисленное значение, которое представляет собой смещение символов во входных данных, потребляемое этим сканированием.
Тип Specifier %p
требует аргумента по умолчанию Ptr
.
Возвращаемое значение обоих вызовов - это количество выходных аргументов, за которыми следуют все выходные данные, сцепные значения могут по умолчанию. В отличие от C и C ++, также подсчитываются аргументы для %n
.
Если входной поток исчерпан до того, как символ будет считываться, EOF -индикатор -1
возвращается вместо количества назначенных значений.
Для спецификаторов формата «пробелы» любое количество символов (также ноль) x
с isspace(x) == true
используется из входного потока.
Для буквального характера спецификатора формата следующий символ читается и сравнивается с буквальным символом. Если это равно, он потребляется, в противном случае процесс не удается.
Если обрабатывается спецификатор формата «символ» %c
, по крайней мере один символ читается и назначен выводному аргументу. Если символ не доступен, процесс сбой.
Если обрабатывается Specifier Format %n
, данные не используются (и не возвращается EOF), но текущая позиция чтения возвращается.
Как получено из ссылки C ++
Функция scanf
считывает вход из потока, на который указан io
под управлением format
строки, который определяет допустимые входные последовательности, и как их следует интерпретировать, используя последующие аргументы для определения типа преобразованного входа. Количество аргументов должно соответствовать количеству спецификаторов формата, требуемых форматом.
Формат состоит из нуля или нескольких директив: один или несколько символов белого пространства (ASCII), обычный (UTF8) символ (ни '%'
, ни (ASCII) символ белого пространства) или спецификацию преобразования. Каждая спецификация конверсии вводится символом '%'
. После '%'
следующее появляется в последовательности:
Необязательный символ, подавляющий назначение '*'
.
Необязательное десятичное целое число, превышающее ноль, которое указывает максимальную ширину поля (в символах).
Необязательный модификатор длины, который не используется этой реализацией.
Символ спецификатора преобразования, который указывает тип преобразования, который должен быть применен.
Функция scanf
выполняет каждую директиву формата по очереди. Когда все директивы были выполнены или если директива не стержена (как подробно описано ниже), функция возвращается. Отказы описываются как сбои ввода (из -за возникновения ошибки кодирования или недоступности входных символов) или сопоставления сбоев (из -за неподходящего ввода).
Директива, состоящая из символов (ы) белого пространства, выполняется путем чтения ввода до первого небелого пространства символа (который остается непрочитанным) или до тех пор, пока не будет прочитать никаких символов. Директива никогда не проходит.
Директива, которая является обычным символом, выполняется путем чтения следующего символа потока. Если этот символ отличается от директивы, директива не работает, а различные и последующие символы остаются непрочитанными. Аналогичным образом, если в конце файла ошибка кодирования или ошибка чтения предотвращает чтение символа, директива не выполняется.
Директива, которая является спецификацией преобразования, определяет набор соответствующих входных последовательностей, как описано ниже для каждого спецификатора. Спецификация преобразования выполняется в следующих шагах:
Входные символы белого пространства (как указано функцией isspace
) пропускаются, если только спецификация не включает спецификацию '['
, 'c'
или 'n'
. Эти символы белого пространства не учитываются по указанной ширине поля.
Входной элемент считывается из потока, если только спецификация не включает спецификатор 'n'
. Входной элемент определяется как самая длинная последовательность входных символов, которая не превышает какую -либо указанную ширину поля и которая является или является префиксом соответствующей последовательности ввода.
Первый символ, если таковой имеется, после входного элемента остается непрочитанным. Если длина входного элемента равна нулю, выполнение директивы не удается; Это условие является сбоем сопоставления, если только конечно файла, ошибка кодирования или ошибка считывания предотвратила вход из потока, и в этом случае это сбой ввода.
За исключением случаев '%'
спецификатора, входной элемент (или, в случае директивы '%n'
, количество входных символов) преобразуется в тип, соответствующий спецификатору преобразования и соответствующим аргументам. Если элемент ввода не является согласованной последовательности, выполнение директивы не удается: это условие является сбоем сопоставления. Если подавление назначения не было указано *
, результат преобразования выдвигается в кортеж.
Если результат преобразования не может быть представлен в типе вывода, ошибочна преобразование.
Необязательные модификаторы длины 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
соответствует необязательно подписанному шестнадцатеричным целым числом, формат которого такой же, как и ожидалось для последовательности субъекта функции parse(T, _, base=16)
.
a
, e
, f
, g
соответствует необязательно подписанному номеру с плавающей запятой, infinity
или NaN
, формат которого такой же, как и ожидалось для
Субъектная последовательность функции parse(T, _)
, где T
- тип плавающей запятой.
c
соответствует последовательности символов точно того числа, указанного шириной поля ( 1
, если в директиве нет ширины поля). Тип аргумента должен быть String
, Char
или Vector{Char}
, если ширина поля больше 1
, а тип Char
дается, хранится только первый символ.
s
соответствует (непусты) последовательности небелых символов. Типы аргументов, как и для c
.
[
Соответствует непустые последовательности символов из набора ожидаемых символов (сканирование). Типы аргументов, как и для c
. Спецификатор преобразования включает в себя все последующие символы в строке формата, вплоть до соответствующего правого кронштейна ( ]
). Персонажи между кронштейнами (Scanlist) составляют сканирование, если только символ после левого кронштейна не является обходом ( ^
), и в этом случае сканирование содержит все символы, которые не появляются в сканировании между окружным и правым скобком. Если спецификатор преобразования начинается с []
или [^]
, символ правого кронштейна находится в сканировании, а следующий следующий правый персонаж - это соответствующий правый кронштейн, который заканчивает спецификацию; В противном случае первый следующий символ правого кронштейна - это тот, который заканчивает спецификацию. Если символ -
в Scanlist и не является первым, ни вторым, где первый персонаж - ^
, и не последний символ, он определяет диапазон между персонажем, левым от -
и правом символом -
. Порядок определения диапазона является целочисленным диапазоном кодепоинтов юникода символов. Пустые диапазоны (как ba
) игнорируются.
p
соответствует набору последовательностей, которые такие же, как и набор последовательностей, которые могут быть получены путем преобразования %p
printf
-функции. Соответствующий аргумент должен быть типа Ptr{T}
где t может быть любым типом. Входной элемент преобразуется в значение указателя определяемым реализацией. Если входной элемент является значением, преобразованным ранее во время той же выполнения программы, указатель, который результаты, должны сравнивать, равное этому значению; В противном случае поведение %p
-конверсии не определено.
n
Нет ввода не потребляется. Соответствующий аргумент должен быть целочисленным типом, в который преобразуется количество символов, считываемых из входного потока до сих пор этим вызовом в функцию scanf
. Выполнение %n
директивы также увеличивает количество назначений, возвращаемого при завершении выполнения функции scanf
. Если спецификация преобразования включает в себя символ, подавляющий назначение, не используется аргумент. Дополнительное поле ширины игнорируется.
%
Совпадает с одним символом '%'
; Конверсии или назначения не происходит. Полная спецификация конверсии составляет %%
. (Другими словами, %%
рассматривается как один обычный символ %
).
Если спецификация преобразования недействительна, поведение не определен.
Спецификаторы преобразования A
, E
, F
, G
и X
также действительны и ведут себя так же, как, соответственно, a
, e
, f
, g
и x
Тяжелое белое пространство (включая новую линию) остается непрочитанным, если только не соответствует директиве. Успех буквальных совпадений и подавленных назначений не является непосредственно определяемым, кроме как через директиву %n
.