sscanf, vsscanf - Formatumwandlungen von Eingabezeichenketten
Standard-C-Bibliothek (libc, -lc)
ÜBERSICHT
#include <stdio.h>
int sscanf(const char *restrict zeichenkette,
const char *restrict format, …);
#include <stdarg.h>
int vsscanf(const char *restrict zeichenkette,
const char *restrict format, va_list ap);
vsscanf():
_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L
Die Funktionenfamilie sscanf() untersucht formatierte
Eingabe entsprechend format, wie es im Folgenden beschrieben wird.
Dieses Format darf Umwandlungsspezifikationen enthalten; die
Ergebnisse solcher Umwandlungen, falls vorhanden, werden an den Stellen
gespeichert, auf die die Zeiger-Argumente verweisen, die sich an
format halten. Jedes Zeiger-Argument muss einen geeigneten Typ
für den Rückgabewert der zugehörigen
Umwandlungsspezifikation haben.
Falls die Anzahl der Umwandlungsspezifikationen in format
die Anzahl der Zeiger-Argumente übersteigt, sind die
Ergebnisse undefiniert. Falls die Anzahl der Zeiger-Argumente die
Anzahl der Umwandlungsspezifikationen übersteigt, werden die
überzähligen Zeiger-Argumente ausgewertet, aber
ansonsten ignoriert.
sscanf() Diese Funktionen lesen ihre Eingabe aus der
Zeichenkette, auf die zeichenkette zeigt.
Die Funktion vsscanf() verhält sich analog zu
vsprintf(3).
Die Zeichenkette format besteht aus einer Abfolge von
Richtlinien, die beschreiben, wie die Abfolge der Eingabezeichen
verarbeitet wird. Wenn das Verarbeiten einer Richtlinie fehlschlägt,
werden keine weiteren Eingaben gelesen und sscanf() kehrt
zurück. Ein »Fehlschlagen« kann Folgendes sein:
input failure bedeutet, dass Eingabezeichen nicht verfügbar
sind. matching failure heißt, dass die Eingabe ungeeignet war
(siehe unten).
Eine Richtlinie kann Folgendes sein:
- •
- eine Abfolge von Leerräumen (Leerzeichen, Tabulator,
Zeilenvorschub, etc.; siehe isspace(3)). Diese Richtlinie passt auf
jede Menge von Leerräumen, einschließlich keinem, in der
Eingabe.
- •
- ein normales Zeichen (d.h. ein anderes, als ein Leerraum oder
»%«). Dieses Zeichen muss exakt mit dem nächsten
Zeichen der Eingabe übereinstimmen.
- •
- eine Umwandlungsspezifikation, die mit dem Zeichen »%«
(Prozent) beginnt. Eine Abfolge von Zeichen wird gemäß
dieser Spezifikation umgewandelt und das Ergebnis wird in das
zugehörige Zeiger-Argument platziert. Falls das
nächste Element nicht der Umwandlungsspezifikation entspricht,
schlägt die Umwandlung fehl — dies ist ein matching
failure.
Jede Umwandlungsspezifikation in format fängt
entweder mit dem Zeichen »%« an oder der Zeichensequenz
»%n$« (siehe unten für die
Unterscheidung) gefolgt von:
- •
- einem optionalen »*«-Zeichen zur Unterdrückung der
Zuweisung: sscanf() liest die Eingabe gemäß der
Umwandlungsspezifikation, verwirft aber die Eingabe. Es wird kein
zugehöriges Zeiger-Argument benötigt und diese
Spezifikation ist nicht in der Anzahl der erfolgreichen Zuweisungen
enthalten, die von scanf() zurückgegeben werden.
- •
- einem optionalen englischen Anführungszeichen (') für
dezimale Umwandlungen. Dies gibt an, dass die Eingabezahl einen
Tausendertrenner wie in der Kategorie LC_NUMERIC der aktuellen
Locale definiert enthalten kann (siehe setlocale(3)). Das
Maskierungszeichen kann dem
»*«-Zuweisungsunterdrückungszeichen folgen oder ihm
vorangehen.
- •
- einem optionalen »m«-Zeichen. Dies wird mit
Zeichenkettenumwandlungen benutzt (%s, %c, %[) und entlastet den
Aufrufenden von der Notwendigkeit, einen zugehörigen Puffer zu
reservieren, der die Eingabe erhält: Stattdessen reserviert
sscanf() einen Puffer von ausreichender Größe und
weist die Adresse dieses Puffers dem zugehörigen
Zeiger-Argument zu, das ein Zeiger auf eine
char *-Variable sein sollte. (Diese Variable muss nicht vor
dem Aufruf initialisiert werden.) Der Aufrufende sollte diesen Puffer
danach mit free(3) freigeben, wenn er nicht länger
benötigt wird.
- •
- einer optionalen dezimalen Ganzzahl, die die maximale Feldbreite
angibt. Das Lesen von Zeichen stoppt entweder wenn dieses Maximum erreicht
wurde oder wenn ein unpassendes Zeichen gefunden wurde, je nachdem, was
eher auftrat. Die meisten Umwandlungen verwerfen Leerräume am
Anfang (die Ausnahmen sind nachfolgend vermerkt). Diese verworfenen
Zeichen werden nicht bei der Berechnung der maximalen Feldbreite
mitgezählt. Eingabeumwandlung von Zeichenketten speichert ein
abschließendes Nullbyte (»\0«), um das Ende der
Eingabe zu kennzeichnen; die maximale Feldbreite enthält dieses
Endezeichen nicht.
- •
- Ein optionales Typveränderungszeichen. Beispielsweise wird
der Typveränderer l mit Ganzzahlumwandlungen wie %d
verwandt, um festzulegen, dass sich das entsprechende
Zeiger-Argument auf ein long anstelle eines Zeigers auf ein
int bezieht.
- •
- Ein Umwandlungskennzeichner, der die Art der durchzuführende
Eingabeumwandlung festlegt.
Die Umwandlungskennzeichner in format gibt es in zwei
Formen, entweder mit »%« oder mit
»%n$« am Anfang. Die zwei Formen sollten
in der gleichen format-Zeichenkette nicht gemischt werden,
außer dass eine Zeichenkette, die
»%n$«-Angaben enthält %%
und %* enthalten kann. Falls format »%«-Angaben
enthält, dann entsprechen sie in der Reihenfolge nachfolgenden
Zeiger-Argumenten. In der Form
»%n$« (die in POSIX.1-2001, aber nicht in
C99 festgelegt ist) ist n eine dezimale Ganzzahl, die festlegt, dass
umgewandelte Eingabe an dem Ort abgelegt werden soll, auf den sich das
n-1 Zeiger-Argument bezieht, das format folgt.
Die folgenden Typveränderungszeichen können
in einer Umwandlungsfestlegung auftauchen:
- h
- Zeigt an, dass die Umwandlung eine aus d, i, o,
u, x, X, n sein wird und dass der
nächste Zeiger ein Zeiger auf short oder unsigned
short (anstelle von int) ist.
- hh
- Wie bei h, aber der nächste Zeiger ist ein Zeiger auf
signed char oder unsigned char.
- j
- Wie bei h, aber der nächste Zeiger ist ein Zeiger auf
intmax_t oder uintmax_t. Dieser Veränderer wurde in
C99 eingeführt.
- l
- Zeigt an, dass die Umwandlung eine aus d, i, o,
u, x, X, n sein wird und dass der
nächste Zeiger ein Zeiger auf long oder unsigned long
(anstelle von int) ist oder dass die Umwandlung eine aus e,
f, g sein wird und dass der nächste Zeiger ein Zeiger
auf double (anstelle von float) ist. Falls zusammen mit
%c oder %s verwandt, wird der entsprechende Parameter als
Zeiger auf ein weites Zeichen bzw. eine Zeichenkette weiter Zeichen
betrachtet.
- ll
- (ell-ell) Zeigt an, dass die Umwandlung eine aus b, d,
i, o, u, x, X, n sein wird und
dass der nächste Zeiger ein Zeiger auf long long oder
unsigned long long (anstelle von int) sein wird.
- L
- Zeigt an, dass die Umwandlung eine aus e, f, or g
sein wird und dass der nächste Zeiger ein Zeiger auf long
double sein wird oder (als GNU-Erweiterung) die Umwandlung eine aus
d, i, o, u, x und dass der
nächste Zeiger ein Zeiger auf long long sein wird.
- q
- äquivalent zu L. Dieser Kennzeichner existiert in ANSI C
nicht.
- t
- Wie bei h, aber der nächste Zeiger ist ein Zeiger auf
ptrdiff_t. Dieser Veränderer wurde in C99
eingeführt.
- z
- Wie bei h, aber der nächste Zeiger ist ein Zeiger auf
size_t. Dieser Veränderer wurde in C99
eingeführt.
Die folgenden Umwandlungskennzeichner sind
verfügbar:
- %
- Passt auf ein wörtliches »%«. Das heißt,
%% in der Formatzeichenkette passt auf ein einzelnes Eingabezeichen
»%«. Es erfolgt keine Umwandlung (aber anfängliche
Leerraumzeichen werden verworfen) und keine Zuweisung.
- d
- Passt auf eine optional vorzeichenbehaftete Ganzzahl; der nächste
Zeiger muss ein Zeiger auf int sein.
- i
- Passt auf eine optional vorzeichenbehaftete Ganzzahl; der nächste
Zeiger muss ein Zeiger auf int sein. Die Ganzzahl wird zur Basis 16
gelesen, falls sie mit 0x oder 0X anfängt; zur Basis
8, falls sie mit 0 beginnt und ansonsten zur Basis 10. Es werden
nur Zeichen verwandt, die der Basis entsprechen.
- o
- Passt auf eine vorzeichenlose oktale Ganzzahl; der nächste Zeiger
muss ein Zeiger auf unsigned int sein.
- u
- Passt auf eine vorzeichenlose dezimale Ganzzahl; der nächste Zeiger
muss ein Zeiger auf unsigned int sein.
- x
- Passt auf eine vorzeichenlose hexadezimale Ganzzahl (die optional mit
einem Präfix 0x oder 0X beginnt, der verworfen wird);
der nächste Zeiger muss ein Zeiger auf unsigned int
sein.
- X
- Äquivalent zu x.
- f
- Passt auf eine optional vorzeichenbehaftete Fließkommazahl; der
nächste Zeiger muss ein Zeiger auf float sein.
- e
- Äquivalent zu f.
- g
- Äquivalent zu f.
- E
- Äquivalent zu f.
- a
- (C99) Äquivalent zu f.
- s
- Passt auf eine Sequenz von nicht-Leerraum-Zeichen; der nächste
Zeiger muss ein Zeiger auf ein anfängliches Element eines
Zeichenfeldes sein, das lang genug ist, um die Eingabesequenz und das
abschließende Nullbyte (»\0«), das automatisch
hinzugefügt wird, aufzunehmen. Die Eingabezeichenkette stoppt beim
Leerraum oder bei der maximalen Feldbreite, je nachdem, was zuerst
erreicht wird.
- c
- Passt auf eine Sequenz von Zeichen, deren Länge durch die
maximale Feldbreite (standardmäßig 1) festgelegt ist;
der nächste Zeiger muss ein Zeiger auf ein char sein und es
muss genug Platz für alle Zeichen sein (es wird kein
abschließendes Nullbyte hinzugefügt). Das gewöhnliche
Überspringen anfänglichen Leerraums wird unterdrückt.
Um zuerst Leerraum zu überspringen, verwenden Sie ein explizites
Leerzeichen in dem Format.
- [
- Passt auf eine nicht leere Zeichensequenz aus der angegebenen Menge von
akzeptierten Zeichen; der nächste Zeiger muss ein Zeiger auf ein
char sein und es muss genug Platz für alle Zeichen in der
Zeichenkette sowie des abschließende Nullbytes sein. Das
gewöhnliche Überspringen anfänglichen Leerraums wird
unterdrückt. Die Zeichenkette muss aus Zeichen in (oder nicht in)
der bestimmten Menge sein; die Menge wird durch die Zeichen zwischen der
öffnenden eckigen Klammer [ und der schließenden
eckigen Klammer ] definiert. Die Menge schließt diese
Zeichen aus, falls das erste Zeichen nach der öffnenden
eckigen Klammer ein Zirkumflex (^) ist. Um eine schließende
Klammer in die Menge aufzunehmen, verwenden Sie es als erstes Zeichen nach
der öffnenden eckigen Klammer oder dem Zirkumflex, an jeder anderen
Position wird sie die Menge schließen. Der Gedankenstrich -
ist auch besonders; wird er zwischen zwei andere Zeichen gestellt,
fügt er alle dazwischen liegenden Zeichen zu der Menge hinzu. Um
einen Gedankenstrich in die Menge aufzunehmen, stellen Sie ihn als letztes
Zeichen vor die finale schließende eckige Klammer. Beispielsweise
bedeutet [^]0-9-] die Menge »alles außer die
schließende eckige Klammer, Null bis Neun und
Gedankenstrich«. Die Zeichenkette endet mit dem Auftauchen eines
Zeichens, das nicht in der Menge ist, oder (falls ein Zirkumflex verwandt
wird) das in der Menge liegt oder wenn die Feldlänge erreicht
wird.
- p
- Passt auf einen Zeigerwert (wie von %p in printf(3)
ausgegeben); der nächste Zeiger muss ein Zeiger auf ein void
sein.
- n
- Es wird nichts erwartet, stattdessen wird die Anzahl der bisher aus der
Eingabe verbrauchten Zeichen durch den nächsten Zeiger gespeichert,
der ein Zeiger auf int oder eine Variante sein muss, deren
Größe auf den (optionalen) ganzzahligen
Längenveränderer passt. Dies ist keine Umwandlung und
vergrößert nicht die durch die Funktion
zurückgelieferte Anzahl. Diese Zuweisung kann mit dem
Zuweisungs-Unterdrückungszeichen * unterdrückt
werden, aber die Auswirkung auf den Rückgabewert ist nicht
definiert. Daher sollten %*n-Umwandlungen nicht verwandt
werden.
Bei Erfolg geben diese Funktionen die Anzahl der Eingabeelemente
zurück, die erfolgreich übereinstimmten und zugewiesen wurden.
Dies können weniger sein, als bereitgestellt wurden oder null, wenn
ein »matching failure« auftrat.
Der Wert EOF wird zurückgeliefert, falls das
Eingabeende erreicht wird, bevor entweder die erste erfolgreiche Umwandlung
erfolgte oder ein »matching failure« auftrat.
- EILSEQ
- Eingabe-Byteabfolge bildet kein gültiges Zeichen.
- EINVAL
- Nicht genug Argumente oder format ist NULL.
- ENOMEM
- Speicher aufgebraucht.
Siehe attributes(7) für eine Erläuterung der
in diesem Abschnitt verwandten Ausdrücke.
| Schnittstelle |
Attribut |
Wert |
| sscanf(), vsscanf() |
Multithread-Fähigkeit |
MT-Sicher locale |
C89, POSIX.1-2001.
Der Umwandlungskennzeichner q ist die 4.4BSD-Notation
für long long, während ll oder die Verwendung
von L in Ganzzahlumwandlungen die GNU-Notation ist.
Die Linux-Version dieser Funktionen basiert auf der Bibliothek
GNU libio. Schauen Sie in die info(1)-Dokumentation von
GNU libc (glibc-1.08) für eine prägnantere
Beschreibung.
Ursprünglich unterstützte die GNU-C-Bibliothek
dynamische Reservierungen für Zeichenketteneingaben (als nicht
standardisierte Erweiterung) mittels des Zeichens a. (Diese
Funktionalität ist seit mindestens Glibc 2.0 vorhanden). Daher
könnte nachfolgendes geschrieben werden, damit sscanf() einen
Puffer für eine Zeichenkette reserviert, wobei ein Zeiger auf diesen
Puffer in *buf zurückgeliefert wird:
char *buf;
sscanf(str, "%as", &buf);
Die Verwendung des Buchstabens a für diesen Zweck
war problematisch, da a durch die ISO-C-Norm auch als Synonym
für f (Fließkommazahleneingabe) definiert ist.
POSIX.1-2008 spezifiziert stattdessen den Modifikator m für
die Zuweisungsreservierung (wie in obiger BESCHREIBUNG dokumentiert).
Beachten Sie, dass der Modifikator a nicht verfügbar
ist, falls das Programm mit gcc -std=c99 oder
gcc -D_ISOC99_SOURCE kompiliert wurde (außer es wurde
auch _GNU_SOURCE angegeben). In diesem Fall wird a als
Kennzeichner für Fließkommazahlen interpretiert (siehe
oben).
Die Unterstützung für den Kennzeichner m
wurde in Glibc 2.7 hinzugefügt und neue Programme sollten diesen
Modifikator anstelle von a verwenden.
Neben der Standardisierung durch POSIX hat der Modifikator
m die folgenden zusätzlichen Vorteile gegenüber der
Verwendung von a:
- •
- Er kann auch in Umwandlungskennzeichnern %c verwandt werden (z.B.
%3mc).
- •
- Er vermeidet Mehrdeutigkeiten in Hinblick auf den
Fließommazahlen-Umwandlungskennzeichner %a (und ist nicht
von gcc -std=c99 usw. betroffen).
Die Verwendung von numerischen Umwandlungskennzeichnern erzeugt
nicht definiertes Verhalten für ungültige Eingabe. Siehe
C11
7.21.6.2/10. Dies ist ein Fehler in der ISO-C-Norm und keine immanente
Eigenschaft mit dem API. Allerdings sind aktuelle Implementierungen nicht
vor dem Fehler gefeit, daher wird deren Verwendung nicht empfohlen.
Stattdessen sollten Programme Funktionen wie strtol(3) verwenden, um
numerische Eingabe auszuwerten. Alternativ entschärfen Sie dies durch
Angabe einer maximalen Feldbreite.
Diese Funktionen sind vollständig C99-konform, bieten aber
die zusätzlichen Modifikatoren q und a sowie
zusätzliches Verhalten der Modifikatoren L und ll an.
Letzteres kann als Fehler angesehen werden, da es das in C99 definierte
Verhalten der Modifikatoren ändert.
Einige Kombinationen der in C99 definierten Typ-Modifikatoren und
Umwandlungskennzeichner ergeben keinen Sinn (z.B. %Ld). Obwohl sie
unter Linux ein gut definiertes Verhalten haben könnten, muss dies
auf anderen Architekturen nicht der Fall sein. Daher ist es normalerweise
besser, Modifikatoren zu verwenden, die überhaupt nicht durch C99
definiert sind, d.h. q anstelle von L in Kombination mit den
Umwandlungen d, i, o, u, x und X
oder ll.
Die Verwendung von q ist nicht identisch zu der auf 4.4BSD,
da es in »float«-Umwandlungen äquivalent zu L
verwandt werden kann.
Um den dynamischen Reservierungs-Umwandlungskennzeichner zu
verwenden, geben Sie m als Längenmodifikator an (daher
%ms oder %m[Bereich]). Der Aufrufende muss
free(3) für die zurückgelieferte Zeichenkette aufrufen,
wie im folgenden Beispiel:
char *p;
int n;
errno = 0;
n = sscanf(str, "%m[a-z]", &p);
if (n == 1) {
printf("gelesen: %s\n", p);
free(p);
} else if (errno != 0) {
perror("sscanf");
} else {
fprintf(stderr, "Keine passenden Zeichen\n");
}
Wie im obigen Beispiel gezeigt, ist der Aufruf von free(3)
nur notwendig, wenn der Aufruf sscanf() erfolgreich eine Zeichenkette
gelesen hat.
ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von
Helge Kreutzmann <debian@helgefjell.de> erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die
GNU General
Public License Version 3 oder neuer bezüglich der
Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite
finden, schicken Sie bitte eine E-Mail an die Mailingliste der
Übersetzer:
debian-l10n-german@lists.debian.org.