sscanf_s, _sscanf_s_l, swscanf_s, _swscanf_s_l

Liest formatierte Daten aus einer Zeichenfolge. Diese Versionen von sscanf, _sscanf_l, swscanf_swscanf_l haben Sicherheitsverbesserungen, wie in den Sicherheitsfeatures in der CRT beschrieben.

Syntax

int sscanf_s(
   const char *buffer,
   const char *format [,
   argument ] ...
);
int _sscanf_s_l(
   const char *buffer,
   const char *format,
   _locale_t locale [,
   argument ] ...
);
int swscanf_s(
   const wchar_t *buffer,
   const wchar_t *format [,
   argument ] ...
);
int _swscanf_s_l(
   const wchar_t *buffer,
   const wchar_t *format,
   _locale_t locale [,
   argument ] ...
);

Parameter

buffer
Gespeicherte Daten

format
Formatsteuerzeichenfolge. Weitere Informationen finden Sie unter "Formatspezifikationsfelder: scanf und wscanf Funktionen".

argument
Optionale Argumente

locale
Das zu verwendende Gebietsschema

Rückgabewert

Jede dieser Funktionen gibt die Anzahl der Felder zurück, die erfolgreich konvertiert und zugewiesen wurden. Der Rückgabewert enthält keine Felder, die gelesen, aber nicht zugewiesen wurden. Ein Rückgabewert von 0 gibt an, dass keine Felder zugewiesen wurden. Der Rückgabewert bei einem Fehler oder beim Erreichen des Endes der Zeichenfolge vor der ersten Konvertierung lautet EOF.

Wenn buffer oder format ein NULL Zeiger ist, wird der ungültige Parameterhandler aufgerufen, wie in der Parameterüberprüfung beschrieben. Wenn die weitere Ausführung zugelassen wird, geben diese Funktionen "– 1" zurück und legen errno auf EINVAL fest.

Informationen zu diesen und anderen Fehlercodes finden Sie unter , , _doserrno, _sys_errlistund _sys_nerr.errno

Hinweise

Die sscanf_s-Funktion liest Daten aus buffer in den Speicherort, der durch das jeweilige argument angegeben wird. Die Argumente nach der Formatzeichenfolge geben Zeiger zu den Variablen an, die einen Typ haben, der einem Typspezifizierer in format entspricht. Im Gegensatz zu den weniger sicheren sscanf-Versionen ist bei der Verwendung der Typfeldzeichen c, C, s, S oder von in [] enthaltenen Zeichenfolgensteuerungssätzen ein Puffergrößenparameter erforderlich. Die Puffergröße in Zeichen muss unmittelbar nach jedem Pufferparameter, der erforderlich ist, als zusätzlicher Parameter angegeben werden. Wenn Sie beispielsweise in eine Zeichenfolge lesen, wird die Puffergröße für diese Zeichenfolge wie folgt übergeben:

wchar_t ws[10];
swscanf_s(in_str, L"%9s", ws, (unsigned)_countof(ws)); // buffer size is 10, width specification is 9

Die Puffergröße enthält das abschließende NULL-Zeichen. Ein Feld für die Breitenangabe muss verwendet werden, um sicherzustellen, dass das eingelesene Token in den Puffer passt. Wenn kein Feld für die Breiteangabe verwendet wird und das Tokenlesefeld zu groß ist, um in den Puffer zu passen, wird nichts in diesen Puffer geschrieben.

Ein einzelnes Zeichen kann wie folgt gelesen werden:

wchar_t wc;
swscanf_s(in_str, L"%c", &wc, 1);

In diesem Beispiel wird ein einzelnes Zeichen aus der Eingabezeichenfolge gelesen und dann in einem Breitzeichenpuffer gespeichert. Wenn mehrere Zeichen für Zeichenfolgen gelesen werden, die nicht mit NULL abschließen, werden ganze Zahlen ohne Vorzeichen für die Breitenangabe und die Puffergröße verwendet.

char c[4];
sscanf_s(input, "%4c", &c, (unsigned)_countof(c)); // not null terminated

Weitere Informationen finden Sie unter scanf_s, , wscanf_s_scanf_s_lund _wscanf_s_lscanf geben Sie Feldzeichen ein.

Hinweis

Der Größenparameter ist vom Typ unsigned und nicht vom Typ size_t. Wenn Sie für 64-Bit-Ziele kompilieren, verwenden Sie eine statische Umwandlung, um _countof- oder sizeof-Ergebnisse in die korrekte Größe zu konvertieren.

Das format-Argument steuert die Interpretation der Eingabefelder und hat die gleiche Form und Funktion wie das format-Argument für die scanf_s-Funktion. Wenn der Kopiervorgang zwischen Zeichenfolgen ausgeführt wird, die sich überschneiden, ist das Verhalten nicht definiert.

swscanf_s ist eine Breitzeichenversion von sscanf_s. Die Argumente für swscanf_s sind Zeichenfolgen mit Breitzeichen. sscanf_s behandelt keine Multibyte-Hexadezimalzeichen. swscanf_s behandelt keine Hexadezimal- oder "Kompatibilitätszone"-Zeichen in Unicode. Andernfalls verhalten sich swscanf_s und sscanf_s identisch.

Die Versionen dieser Funktionen mit dem _l-Suffix sind beinahe identisch, verwenden jedoch den Gebietsschemaparameter, der anstelle des aktuellen Threadgebietsschemas übergeben wurde.

Generische Textroutinzuordnungen

TCHAR.H Routine _UNICODE und _MBCS nicht definiert _MBCS Definiert _UNICODE Definiert
_stscanf_s sscanf_s sscanf_s swscanf_s
_stscanf_s_l _sscanf_s_l _sscanf_s_l _swscanf_s_l

Anforderungen

Routine Erforderlicher Header
sscanf_s, _sscanf_s_l <stdio.h>
swscanf_s, _swscanf_s_l <stdio.h> oder <wchar.h>

Weitere Informationen zur Kompatibilität finden Sie unter Kompatibilität.

Beispiel

// crt_sscanf_s.c
// This program uses sscanf_s to read data items
// from a string named tokenstring, then displays them.

#include <stdio.h>
#include <stdlib.h>

int main( void )
{
   char  tokenstring[] = "15 12 14...";
   char  s[81];
   char  c;
   int   i;
   float fp;

   // Input various data from tokenstring:
   // max 80 character string plus null terminator
   sscanf_s( tokenstring, "%s", s, (unsigned)_countof(s) );
   sscanf_s( tokenstring, "%c", &c, (unsigned)sizeof(char) );
   sscanf_s( tokenstring, "%d", &i );
   sscanf_s( tokenstring, "%f", &fp );

   // Output the data read
   printf_s( "String    = %s\n", s );
   printf_s( "Character = %c\n", c );
   printf_s( "Integer:  = %d\n", i );
   printf_s( "Real:     = %f\n", fp );
}
String    = 15
Character = 1
Integer:  = 15
Real:     = 15.000000

Siehe auch

Stream-E/A
fscanf, _fscanf_l, fwscanf, _fwscanf_l
scanf, _scanf_l, wscanf, _wscanf_l
sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l
snprintf, _snprintf, _snprintf_l, _snwprintf, _snwprintf_l