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_errlist
und _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_l
und _wscanf_s_l
scanf
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.
Mapping generischer Textroutinen
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