Scanf scans UTF8-kodierte Eingabestreams oder -ketten und erstellt Ausgabedaten gemäß einer Formatzeichenfolge. Es ahmt das Verhalten der C-Funktion mit demselben Namen nach.
Julia> mit Scanf Julia> r, a, b = @scanf ("13 Dies ist eine Primzahl", "%d%[a-za-z]", int, String) (2, 13, "Dies ist eine Primzahl")# Daten in einem glücklichen Tuplejulia> r, t ... = @scanf "1 2 -inf 4 u4119" "%d%U%e%x%s" Sammeln Sie " 0 uint 0.0 int "" (5, 1, 0x00000000000002, -inf, 4, "䄙")# Scan -Datum -Zeit -Zeichenfolge -Beachten Sie die S- und MS -Teile verwenden die Standardwerte. 2d.%2d%*1 [t]%2d:%2d:%2d.%3d "; Julia> R, Y, M, D, H, M, S, Ms = Scanf ("2021.07.04T15: 53", F, int, Nullen (int8, 5) ..., int16) (5, 2021, 7, 4, 15, 53, 0, 0)
Scanf
liefert das Makro r, a,... = @scanf([io, ] "format_string", args...)
und die Funktion r, a,... = scanf(io, f::Scanf.Format, args...)
.
Die Formatzeichenfolge muss ein Saitenliteral sein, das einmal zur Makroerweiterungszeit bewertet wird.
Alternativ f = Scanf.format"format_string"
oder f = Scanf.Format(::AbstractString)
Erstellen Sie ein Formatobjekt, das im Funktionsaufruf verwendet werden kann.
Die Argumente sind Standardwerte von typen Real
, AbstractChar
, AbstractString
, Ptr
, AbstractVector{Char}
.
Sie können auch konkrete Subtypen von Real
, AbstractChar
, AbstractString
, Ptr
sein.
Numerische Formatspezifizierer sind mit numerischen Argumenten und String
kompatibel. Konvertierungsfehler können auftreten (float => int).
Wenn der numerische Arg -Typ für den Wert nicht breit genug ist, werden die Grenzwerte mit dem richtigen Vorzeichen gespeichert (z. B. Inf
, -0.0
).
Formatspezifizierer c
, s
[
sind alle mit Argumenten Char
, Char[]
und String
kompatibel. Im Falle von Char
wird der erste Charakter einer Saite genommen.
Alle Ausgabedaten werden als Tupel zurückgegeben, einschließlich der Anzahl der zugewiesenen Werte als erstes Element. Wenn ein Wert nicht analysiert werden kann, wird der Standardwert zugewiesen. Im Falle eines Wertes liegt im entsprechenden Element von arg
der Standardwert T
.
Wenn das Standardargument ein Vector
ist, werden die Ausgabewerte zusätzlich darin gespeichert.
Die Formatketten folgen der Definition von C ++-Scanf C ++ Referenz mit einigen Anpassungen:
Alle Unicode -Zeichen werden in Formatketten und Eingabedaten unterstützt.
In Formatketten sind Whitespace -Spezifizierer nur die ASCII -Raumzeichen in " nrtfv"
.
In Eingabedaten werden alle Zeichen x
mit isspace(x) == true
von jedem Whitespace -Spezifizierer in der Formatzeichenfolge übersprungen.
Die %n$...
Form der Formatspezifikationen wird nicht unterstützt.
Optionale Typmodifikatoren wie h
, l
, L
usw. werden ignoriert; Der Zieltyp wird stattdessen aus dem entsprechenden Standardargument abgeleitet.
Für den Typ -Spezifizierer %c
muss das entsprechende Argument ohne width
des entsprechenden Arguments einen Typ Char
oder String
haben.
Für den Typ -Spezifizierer %Nc
muss das Argument mit einem Breitenfeld N
ein Typ String
oder Vector{Char}
haben. Dieser Vektor wird wiederverwendet und an die Anzahl der tatsächlich gelesenen Zeichen geändert.
Der Typ -Spezifizierer %n
gibt einen Ganzzahlwert zurück, der der in den Eingangsdaten von diesem Scanf bisher konsumierte Zeichenversatz ist.
Der Typ -Spezifizierer %p
erfordert ein Ptr
-Standardargument.
Der Rückgabewert beider Aufrufe ist die Menge der Ausgangsargumente, gefolgt von allen Ausgabedaten, die nachverfolgenden Standardwerte. Im Gegensatz zu C und C ++ werden auch die Argumente für %n
gezählt.
Wenn der Eingangsstrom erschöpft ist, bevor ein Zeichen gelesen wird, wird der EOF -Indicator -1
anstelle der Anzahl der zugewiesenen Werte zurückgegeben.
Für Formatspezifizierer "Whitespace" werden eine beliebige Anzahl von Zeichen (auch Null) x
mit isspace(x) == true
aus dem Eingabestream konsumiert.
Für einen buchstäblichen Charakter eines Formatspezifizierers wird der nächste Charakter gelesen und mit dem wörtlichen Charakter verglichen. Wenn es gleich ist, wird es konsumiert, andernfalls schlägt der Prozess fehl.
Wenn das Formatspezifizierer "Zeichen" %c
verarbeitet wird, wird mindestens ein Zeichen gelesen und dem Ausgangsargument zugeordnet. Wenn kein Charakter verfügbar ist, schlägt der Prozess fehl.
Wenn das Formatspezifizierer %n
verarbeitet wird, werden keine Daten verbraucht (und kein EOF zurückgegeben), aber die aktuelle Leseposition wird zurückgegeben.
Wie aus C ++ Referenz abgeleitet
Die scanf
-Funktion liest die Eingabe aus dem von io
unter Kontrolle des String format
gezeigten Streams, das die zulässigen Eingabesequenzen angibt und wie sie interpretiert werden sollen, wobei nachfolgende Argumente zur Definition des Typs der konvertierten Eingabe definiert werden. Die Anzahl der Argumente muss mit der Anzahl der vom Format geforderten Formatspezifizierer übereinstimmen.
Das Format besteht aus Null oder mehr Richtlinien: ein oder mehrere (ASCII) weiße Raumzeichen, ein gewöhnliches (utf8) Zeichen (weder '%'
noch ein (ASCII) weißer Space-Zeichen) oder eine Konvertierungsspezifikation. Jede Konvertierungsspezifikation wird durch den Charakter '%'
eingeführt. Nach dem '%'
erscheint das Folgende in Sequenz:
Ein optionales Zeichen-Suppressing-Zeichen '*'
.
Eine optionale Dezimalzahlung größer als Null, die die maximale Feldbreite (in Zeichen) angibt.
Ein optionaler Längenmodifikator, der bei dieser Implementierung nicht verwendet wird.
Ein Konvertierungsspezifizierer -Zeichen, der die Art der zu angewendeten Konvertierung angibt.
Die scanf
-Funktion führt jede Richtlinie des Formats nacheinander aus. Wenn alle Richtlinien ausgeführt wurden oder wenn eine Anweisung fehlschlägt (wie unten detailliert), gibt die Funktion zurück. Fehler werden als Eingabefehler beschrieben (aufgrund des Auftretens eines Codierungsfehlers oder der Nichtverfügbarkeit von Eingangszeichen) oder übereinstimmenden Ausfällen (aufgrund unangemessener Eingaben).
Eine Richtlinie, die aus weißem Raum besteht, wird ausgeführt, indem die Eingaben bis zum ersten nicht-weiß-Raum-Charakter (das ungelesen bleibt) oder bis keine MECOR MECTER gelesen werden kann. Die Richtlinie scheitert nie.
Eine Richtlinie, die ein gewöhnlicher Charakter ist, wird ausgeführt, indem der nächste Charakter des Streams gelesen wird. Wenn sich dieser Charakter von der Richtlinie unterscheidet, schlägt die Richtlinie fehl und die unterschiedlichen und nachfolgenden Zeichen bleiben ungelesen. In ähnlicher Weise schlägt die Anweisung fehl.
Eine Richtlinie, die eine Konvertierungsspezifikation ist, definiert eine Reihe von übereinstimmenden Eingangssequenzen, wie nachstehend für jeden Spezifizierer beschrieben. In den folgenden Schritten wird eine Konvertierungsspezifikation ausgeführt:
Eingabemittel weiße Space-Zeichen (wie in der isspace
-Funktion angegeben) werden übersprungen, es sei denn, die Spezifikation enthält einen '['
, 'c'
oder 'n'
Spezifizierer. Diese weißen Raumfiguren werden nicht gegen eine bestimmte Feldbreite gezählt.
Ein Eingabelement wird aus dem Stream gelesen, es sei denn, die Spezifikation enthält einen 'n'
-Spezifizierer. Ein Eingabelement ist definiert als die längste Sequenz von Eingabezeichen, die eine bestimmte Feldbreite nicht überschreitet und ein Präfix einer übereinstimmenden Eingangssequenz ist oder ein Präfix ist.
Das erste Charakter, falls vorhanden, nach dem Eingabelement bleibt ungelesen. Wenn die Länge des Eingangselements Null ist, schlägt die Ausführung der Richtlinie fehl. Diese Bedingung ist ein übereinstimmender Fehler, es sei denn, ein Datumendunternehmen, ein Codierungsfehler oder ein Lesefehler, das die Eingabe aus dem Stream verhindert. In diesem Fall handelt es sich um einen Eingangsfehler.
Außer im Fall eines '%'
-Pecifierers wird der Eingangselement (oder im Fall einer '%n'
-Richtlinie die Anzahl der Eingabebereiche) in einen Typ konvertiert, der dem Konvertierungsspezifizierer entspricht und das entsprechende Argument entspricht. Wenn es sich bei dem Eingabelement nicht um eine übereinstimmende Sequenz handelt, schlägt die Ausführung der Anweisung fehl: Diese Bedingung ist ein Matching -Fehler. Sofern die Unterdrückung der Zuordnung nicht durch a *
angezeigt wurde, wird das Ergebnis der Umwandlung auf das Ouput -Tupel gedrückt.
Wenn das Ergebnis der Konvertierung im Ausgangstyp nicht dargestellt werden kann, wird ein Konvertierungsfehler geworfen.
Optionale Längenmodifikatoren l
, ll
, h
, hh
, L
, j
, z
, t
werden vor allen Typ -Spezifikatorzeichen akzeptiert, aber ansonsten ignoriert.
Die Konvertierungsspezifizierer und ihre Bedeutungen sind:
d
entspricht einer optional signierten Dezimalgülle, deren Format für die Subjektsequenz des parse(T, _, base=10)
die gleiche ist, wobei T
der Ganzzahltyp des Arguments ist.
i
entspricht einer optional signierten Ganzzahl, deren Format für die Subjektsequenz des parse(T, _, base=nothing)
das gleiche ist.
o
entspricht einer optional signierten Octal Integer, deren Format für die Subjektsequenz des parse(T, _, base=8)
die gleiche ist.
u
entspricht einer optional signierten Dezimalgülle, deren Format für die Subjektsequenz des parse(T, _, base=10)
das gleiche ist.
x
entspricht einer optional signierten hexadezimalen Ganzzahl, deren Format für die Subjektsequenz von Thew parse(T, _, base=16)
die gleiche ist.
a
, e
, f
, g
entspricht einer optional signierten Schwimmpunktzahl, infinity
oder NaN
, deren Format wie erwartet für die erwartet ist
Betreffsequenz der parse(T, _)
, wobei T
ein schwimmender Punkttyp ist.
c
entspricht einer Abfolge von Zeichen der genauen Zahl der von der Feldbreite angegebene Zahl ( 1
wenn in der Richtlinie keine Feldbreite vorhanden ist). Der Argumentyp muss String
, Char
oder Vector{Char}
sein, wenn die Feldbreite größer als 1
ist und ein Char
angegeben ist, wird nur das erste Zeichen gespeichert.
s
entspricht einer (nicht leeren) Sequenz nicht-weißer Raumzeichen. Die Argumententypen sind wie bei c
.
[
Entspricht einer nicht leeren Abfolge von Zeichen aus einer Reihe von erwarteten Zeichen (der Scanset). Die Argumententypen sind wie bei c
. Der Conversion -Spezifizierer enthält alle nachfolgenden Zeichen in der Formatzeichenfolge bis hin zu und einschließlich der passenden rechten Klammer ( ]
). Die Zeichen zwischen den Klammern (der Scanliste) komponieren das Scanset, es sei denn, das Zeichen nach der linken Klammer ist ein Circumflex ( ^
). In diesem Fall enthält das ScanSet alle Zeichen, die nicht in der Scanlist zwischen dem Zirkumflex und der rechten Klammer erscheinen. Wenn der Konvertierungsspezifizierer mit []
oder [^]
beginnt, befindet sich das rechte Halterungszeichen in der Scanliste und das nächste folgende rechte Klassencharakter ist die passende rechte Klammer, die die Spezifikation beendet; Andernfalls ist der erste folgende rechte Klammercharakter derjenige, der die Spezifikation beendet. Wenn sich ein -
Zeichen in der Scanliste befindet und nicht der erste ist, noch der zweite, in dem das erste Zeichen ein ^
oder das letzte Zeichen ist, definiert es den Bereich zwischen dem Zeichen, das links von -
und dem Charakter rechts von -
ist. Die Reihenfolge, in der der Bereich definiert wird, ist der Ganzzahl von Unicode -CodePoints der Zeichen. Leere Bereiche (wie ba
) werden ignoriert.
p
entspricht einer Reihe von Sequenzen, die mit dem Satz von Sequenzen übereinstimmen, die durch die %p
-Umwandlung der printf
-Funktion erzeugt werden können. Das entsprechende Argument muss vom Typ Ptr{T}
sein, wobei t jeder Typ sein kann. Das Eingabeelement wird auf implementierungsdefinierte Weise in einen Zeigerwert konvertiert. Wenn es sich bei dem Eingabelement um einen Wert handelt, der früher während derselben Programmausführung konvertiert wurde, muss der Zeiger, der die Ergebnisse gleich mit diesem Wert vergleichen muss. Andernfalls ist das Verhalten der %p
-Umwandlung undefiniert.
n
Es werden keine Eingaben konsumiert. Das entsprechende Argument muss ein Ganzzahl -Typ sein, in dem die Anzahl der aus dem Eingabestream durch diesen Aufruf in die scanf
-Funktion gelesenen Zeichen konvertiert wird. Die Ausführung einer %n
-Richtlinie erhöht sowie die nach Abschluss der Ausführung der scanf
-Funktion zurückgegebene Zuordnungszahl. Wenn die Conversion-Spezifikation ein Zuweisungs-Suppressing-Charakter enthält, wird kein Argument konsumiert. Ein optionales Feld der Breite wird ignoriert.
%
Entspricht einem einzigen '%'
Charakter; Es tritt keine Umwandlung oder Zuordnung auf. Die vollständige Konvertierungsspezifikation ist %%
. (Mit anderen Worten wird %%
wie ein einzelner gewöhnlicher Zeichen %
behandelt).
Wenn eine Konvertierungsspezifikation ungültig ist, ist das Verhalten undefiniert.
Die Konvertierungsspezifizierer A
, E
, F
, G
und X
sind ebenfalls gültig und verhalten sich gleich wie a
, e
, f
, g
und x
Nachfolgender White Space (einschließlich neuer Charaktere) bleibt ungelesen, es sei denn, sie werden von einer Richtlinie übereinstimmen. Der Erfolg von buchstäblichen Übereinstimmungen und unterdrückten Zuordnungen ist außer der %n
-Richtlinie nicht direkt bestimmbar.