oracular (3) sscanf.3.gz

Provided by: manpages-de-dev_4.23.1-1_all bug

BEZEICHNUNG

       sscanf, vsscanf - Formatumwandlungen von Eingabezeichenketten

BIBLIOTHEK

       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);

   Mit Glibc erforderliche Feature-Test-Makros (siehe feature_test_macros(7)):

       vsscanf():
           _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L

BESCHREIBUNG

       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.

   Umwandlungen
       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.

RÜCKGABEWERT

       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.

FEHLER

       EILSEQ Eingabe-Byteabfolge bildet kein gültiges Zeichen.

       EINVAL Nicht genug Argumente oder format ist NULL.

       ENOMEM Speicher aufgebraucht.

ATTRIBUTE

       Siehe attributes(7) für eine Erläuterung der in diesem Abschnitt verwandten Ausdrücke.

       ┌─────────────────────────────────────────────────────────────┬───────────────────────┬──────────────────┐
       │SchnittstelleAttributWert             │
       ├─────────────────────────────────────────────────────────────┼───────────────────────┼──────────────────┤
       │sscanf(), vsscanf()                                          │ Multithread-Fähigkeit │ MT-Sicher locale │
       └─────────────────────────────────────────────────────────────┴───────────────────────┴──────────────────┘

STANDARDS

       C11, POSIX.1-2008.

GESCHICHTE

       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.

ANMERKUNGEN

   Der »a«-Zuweisung-Reservierungs-Veränderer
       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).

FEHLER

   Numerische Umwandlungskennzeichner
       Die Verwendung von numerischen Umwandlungskennzeichnern erzeugt nicht definiertes Verhalten für ungültige
       Eingabe. Siehe C11 7.21.6.2/10  ⟨https://port70.net/%7Ensz/c/c11/n1570.html#7.21.6.2p10⟩.  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.

   Nicht standardisierte Modifikatoren
       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.

BEISPIELE

       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.

SIEHE AUCH

       getc(3), printf(3), setlocale(3), strtod(3), strtol(3), strtoul(3)

Ü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
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ 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⟩.